Git使用

作者: CH_DHY | 来源:发表于2018-03-26 13:16 被阅读17次

    安装

    apt install git
    

    使用

    • windows 右键打开git bash。
    • Ubuntu 打开terminal
      查看帮助命令,会在默认浏览器中打开对应命令的本地帮助手册:
    git help command
    # or
    git command --help
    

    Create

    新建一个本地仓库git init会把当前文件作为git的仓库
    克隆一个远程仓库git clone repourl把当前文件夹作为git的仓库克隆远程的仓库到本地
    两者都会自动创建一个名为master的本地分支。

    Update

    在git中,所有文件都分为三种状态

    • 已修改
      文件被修改了,还没提交到暂存区。修改状态包括,modified,new file,delete
    • 已暂存
      文件被提交到暂存区,即被放到了下次将提交的清单中,下次做提交时将会提交这些文件。
    • 已提交
      已修改的文件被安全提交到了本地仓库中了。

    添加修改到暂存区

    # 添加单个文件
    git add filename
    # 添加全部文件,"."代表当前文件夹,将当前文件夹加入即代表添加全部文件
    git add .
    

    提交暂存区文件到本地仓库

    # 交互式,会弹出提交信息编辑界面
    git commit
    # 直接添加信息
    git commit -m "commit msg"
    # 当目前没有新增文件时(即所有文件之曾被add过),可以add文件,直接使用下面的命令
    git commit -a -m (可合并写为-am) "commit msg"
    

    修改提交

    • 修改最后一次提交
    git reset --hard HEAD^
    
    # 此命令的作用是将HEAD移动到当前HEAD所指向记录的前一条记录,主要参数有三个
    # --mixed(默认),会将当前HEAD和HEAD^的差异放到工作区中,如果当前工作区中有内容,会将其混合在一起
    # --hard 抛弃当前HEAD和HEAD^的差异,起到重置效果
    # --soft 将当前HEAD和HEAD^的差异放到暂存区中
    
    • 修改任意一次提交(删除提交,改变提交顺序,分拆提交,压缩提交)
    git rebase -i commitref
    
    # 以交互模式对指定修改变基,比如git rebase -i HEAD~3,修改前面三次的提交,反馈如下
    
    pick f7f3f6d changed my name a bit
    pick 310154e updated README formatting and added blame
    pick a5f4a0d added cat-file
    
    # Rebase 710f0f8..a5f4a0d onto 710f0f8
    #
    # Commands:
    #  p, pick = use commit
    #  e, edit = use commit, but stop for amending
    #  s, squash = use commit, but meld into previous commit
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    # However, if you remove everything, the rebase will be aborted.
    #
    
    # pick表示采用该次提交
    # edit表示会编辑该次提交,当逐一应用每次提交到该次时,会把该次提交恢复到工作区,再自由提交(可拆分提交)
    # squash表示压缩该次提交,和上一个pick的提交压缩为一次提交,可连续squash连续压缩为一次
    # 该顺序代表了应用提交的顺序,可以修改顺序。删除改行,表示弃用该次提交
    
    edit 310154e updated README formatting and added blame
    squash f7f3f6d changed my name a bit
    
    # 这样的修改表示,将第二次与第一次提交交换顺序
    # 并编辑第二次修改
    # 将第一次的提交和编辑后的第二次提交压缩为一次提交
    # 删除第三次提交
    
    • 拣选提交,从其他分支上拣选需要的提交到本地分支来,并不直接rebase
    # 拣选提交
    git cherry-pick commitref
    
    • 抵消提交,在commit中提交一次和该应该用相反的修改,抵消该次修改的效果。
    git revert commitref
    

    撤销操作

    • 撤销工作区修改
    ## 不加"--"可能会有歧义,如果有文件同名分支,则会迁出到该分支
    
    git checkout -- filename
    
    • 撤销暂存区修改
    git reset HEAD filename
    

    examine

    • 查看当前状态
    git status
    
    • 查看分支
    git branch
    
    • 查看区别
    # 工作区和暂存区不同
    git diff
    
    # 查看暂存区和上次提交不同
    git diff --staged
    
    # 查看工作区和上次提交不同
    git diff HEAD
    
    • 查看提交
    # 查看某个commit
    git show commitred
    
    # 查看某个commit具体文件
    git show commitref filename
    
    • 查看提交历史
    # 详细改动
    git log -p
    
    # 大致改动
    git log --stat commitref
    
    # 图形显示
    git log --graph
    
    # 查看单词级别的改动,U1指改动的上下文为一行,默认3,必须搭配U使用才能显示,新增单词用{++}括起来,删除单词用[--]
    git log -U1 --word-diff
    
    # 显示格式控制(长短) --pretty等价于命令--format
    git log --pretty=oneline|short|medium|full|fuller|raw
    # 显示格式控制(内容) %Cred-从此将输出颜色改为红色,%h-6位hash,%Cgreen-改为绿色,%Creset重置颜色,%n-换行
    git log --pretty="%Cred%h %Cgreen%an %n %Creset%cD %n %C(#ff9900)%s %n"
    # 将40位的SHA1值显示为6位
    git log --abbrev-commit
    # 等价于 --pretty=oneline --abbrev-commit
    git log --oneline
    
    # 查看前n个记录
    git log -n
    # 查看截止到commitref的提交历史
    git log commitref
    # 显示截至日期以后的记录 --since等价于--after
    git log --after=24.hours
    # 显示截至日期以前的记录 --until等价于--before
    git log --before=3.days
    # 限制最小父节点数量, =2时等价于命令--merge
    git log --min-parents=2
    # 限制最大父节点数量, =1时等价于命令--no-merge
    git log --max-parents=1
    

    branch and tag

    • 分支 branch
    # 查看分支 *指代当前分支
    git branch
    
    # 查看分支简要信息
    git branch -v
    
    # 查看已经被合并到当前分支的分支(即在本分支的上游)
    git branch --merged
    
    # 查看未被合并到当前分支的分支(即查看未合并的工作分支)
    git branch --no-merged
    
    # 新建分支
    git branch branchname
    
    # 切换分支
    git checkout branchname
    
    # 新建并切换到该分支
    git checkout -b branchname
    
    # 合并分支,将branchname分支合并到当前分支
    git merge branchname
    
    # 删除分支,-D强制删除,抛弃分支上未合并的修改
    git branch -d branchname
    
    # 将HEAD指向当前commit,和当前branch分离
    git branch --detach
    
    • 标签 Tag
    # 显示标签,注:标签按字母顺序排序
    git tag
    
    # 轻量级标签
    git tag tagName
    
    # 打一个含注释标签,不着不用-m命令,交互式打标签
    git tag -a tagName -m "tag msg"
    
    # 显示标签信息
    git show tagName
    
    # 后期加注标签
    git tag tagName commitref
    
    # 删除标签
    git tag -d tagName
    
    # 推送标签到远程仓库,注:push不会推送tag,tag需要手动推送
    git push remoteRepoName tagName
    # 推送全部标签
    git push remoteRepoName --tags
    

    remote repo

    # 查看远程仓库名
    git remote
    
    # 查看远程仓库简要信息
    git remote -v
    
    # 显示某个远程仓库信息
    git remote show remoteRepoName
    
    # 添加远程仓库
    git remote add remoteRepoName remoteRepoUrl
    
    # 重命名远程仓库
    git remote rename oldName newName
    
    # 删除远程仓库
    git remote rmremoteRepoName
    
    # 获取远程仓库数据,将远程数据镜像到本地,默认名字是origin,分支名为origin/branchName
    git fetch
    
    # 跟踪某个远程分支
    git branch --set-upstream remoteRepoName/branchName
    # 从远程分支迁出,自动跟踪这个分支
    git checkout -b branchName remoteRepoName/branchName
    # 拉取远程分支,fetch远程分支,并将tracked remote分支merge本地当前分支,后面加分支名表示拉取指定分支并merge到当前分支
    git pull
    # 重置跟踪远程分支
    git branch --unset-upstream
    # 推送到远程同名分支
    git push(已track同名远程分支)
    git push remoteRepoName branchName
    # 推送到远程分支并关联,-u等价于--set-upstream,如果branchName=remoteBranchName,下次可直接git push
    git push -u remoteRepoName branchName:remoteBranchName
    

    Stash

    储藏工作。当遇到需要紧急切换分支等情况,而当前的工作不足以做一次提交时,可以使用stash储藏当前工作,切换到另外的分支,完成工作再回到当前分支,取出储藏的工作,继续工作。也可以将当前工作区的工作储藏起来,到另外的分支取去来使用。

    # 储藏工作
    git stash
    
    # 查看储藏的工作列表
    git stash list
    
    # 应用最近一次储藏
    git stash apply
    # 应用最后一次储藏,并从列表中删除
    git stash pop
    # 应用指定储藏
    git stash apply stashref
    # 以上的应用类似于 reset --mixed效果,将之前的暂存区和工作区更改混合后放到工作区,--index可原样恢复
    git stash apply --mixed
    
    # 删除指定的储藏
    git stash drop stashref
    
    # 取消应用的stash,没有unstash命令,但是可以曲线救国,以补丁的方式显示stash的内容,并把内容输出到apply命令以-R(reverse)方式应用。
    git stash show -p | git apply -R
    

    filter-branch

    filter-branch该命令通过对提交树应用自定义的分支达到对提交记录的修改。

    # 从所有提交中删除一个文件
    git filter-branch --tree-filter 'rm -f fileName' HEAD
    
    # 对符合条件的修改提交做修改,--all选项用于指定所有分支,需要和前面的命令用```--```分隔开来
    git filter-branch --commit-filter '
            if [ "$GIT_AUTHOR_NAME" = "dhy" ];
            then
                    GIT_AUTHOR_NAME="chdhy";
                    GIT_AUTHOR_EMAIL="chdhy@example.com";
                    git commit-tree "$@";
            else
                    git commit-tree "$@";
            fi' -- --all
    
    # 删除修改过后系统留下的/original/refs/heads/branchname,即原提交的记录
    # 删除指定分支记录
    git update-ref -d refs/original/refs/heads/branchname
    # 删除所有分支记录
    git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
    

    Syntax

    • ^ 与某个提交记录合用,跟在其后面,可以是HEAD,hash值,HEAD^^^表示当前提交记录的往前的第三次记录
    • ~ 与^作用类似,用法为跟在其后面加数字,HEAD~8表示当前提交记录往前的第8次记录
    • .. 指明范围语法,git log master..dev表示从master分支出发,不包含master分支的提交记录。可以用来查看自上次推送远程仓库后再本地做的提交记录git log origin/dev..devorigin/master....不跟记录默认使用HEAD代替不存在的一边。
    • --not 或 前置^ 表示不包含
    # 三个命令等价
    git log refA..refB
    git log ^refA refB
    git log refB --not refA
    
    • ... 指代两者各自独有的部分,可以显示两个分支分叉的部分,配合特定命令调节符显示效果很清晰,<表示记录归属...左边的记录,>表示右边。
    $ git log --left-right --oneline test2...test
    < 57cb468 一个买不起
    > 374db5a add code.txt
    > 2546519 买不起,add code
    > 5d5d530 let it go 买买买
    

    .gitignore

    .gitignore文件放在工作目录的顶层,让git忽略里面规定的文件类型,不做提交。参考如下:

    # 忽略所有.txt文件
    *.txt
    
    # 除了note.txt
    !note.txt
    
    # 忽略'!a.do'这个文件
    \!a.do
    
    # 忽略build文件夹及其下的文件,但不包括根目录下的名字为'build'的文件
    build/
    
    # 忽略gen文件和gen文件夹,同/gen
    gen
    
    # 忽略bin目录下的直接子.class文件,如果其下还有文件夹,其子文件夹下的.class文件不会被忽略
    gen/*.class
    
    # 忽略log文件夹下的所有.log文件,包括其子文件夹下的文件,**包含文件夹下的所有文件夹
    gen/**/*.log
    
    # git默认不会添加空文件夹,可在空文件夹中加入文件.gitkeep强制添加空文件夹
    
    # 其他基本过滤规则
    * ?:代表任意的一个字符
    * *:代表任意数目的字符
    * {!ab}:必须不是此类型
    * {ab,bb,cx}:代表ab,bb,cx中任一类型即可
    * [abc]:代表a,b,c中任一字符即可
    * [ ^abc]:代表必须不是a,b,c中任一字符
    

    git config

    git配置,一共有三种。

    • 1..git/config文件,用于针对项目范围内的配置
    • 2.~/.gitignore文件,用于针对用户全局配置
    • 3./etc/gitconfig文件,Linux下针对所有用户的配置
    # 查看用户配置,--global只看用户级的,默认看全部
    git config --list
    
    # 配置全局用户名
    git config --global user.name "chdhy"
    
    # 配置项目用户邮箱
    git config user.email chdhy@qq.com
    
    # 配置用户默认编辑器
    git config --global core.editor vim
    
    # 配置用户diff工具
    * git config --global merge.tool vimdiff
    
    # 配置全局命令别名
    git config --all alias.com commit
    git config --all alias.che chekout
    git config --all alias.bra branch
    git config --all alias.sta status
    git config --all alias.rem remote
    git config --all alias.fet fetch
    git config --all alias.mer merge
    git config --all alias.reb rebase
    git config --all alias.res reset
    git config --all alias.rev revert
    
    # 利用别名创造新命令
    git config --all alias.logo 'log --oneline'
    git config --all alias.coma 'commit -am'
    

    其他命令

    # 查看git的HEAD的引用变化记录
    git reflog
    
    # 制作简报,显示从v1.0.1以来的提交记录,按author分类
    git shortlog --no-merges master --not v1.0.1
    

    参考:

    1. https://www.jianshu.com/p/fe76f2890a14
    2. https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
    3. http://www.ruanyifeng.com/blog/2012/07/git.html
    4. https://github.com/github/gitignore/blob/master/Android.gitignore
    5. http://www.infoq.com/cn/news/2011/01/git-adventures-1?utm_source=news_about_git-adventures&utm_medium=link&utm_campaign=git-adventures
    6. https://blog.haohtml.com/archives/15965

    相关文章

      网友评论

          本文标题:Git使用

          本文链接:https://www.haomeiwen.com/subject/owqrcftx.html