Git快速使用指南

2013.08.25/2015.06.01发布于笔记暂无评论/目录

阅读“Pro Git“后写的笔记,当做速查手册(quick git reference)来用,以供日常查阅。常见的git错误和解决方案可参考git问题整理,更多内容可参考这里

使用git的时候,不管出现什么问题,只要修改被commit了,你所要做的就是:

Keep calm and use git reflog

图片取自 KEEP CALM AND USE GIT REFLOG

部分命令需要安装git-extras包。

特殊符号

详细内容可参考gitglossary的man页。

man 7 gitglossary

或直接查看这里

HEAD      # the commit at the tip of a branch
HEAD^     # first parent of HEAD
HEAD~2    # second parent of HEAD
HEAD^^    # first parent of HEAD^ 
HEAD~3    # first parent of HEAD^^(HEAD~2)
HEAD~3^2  # second parent of HEAD^^

ORIG_HEAD # previous state of HEAD, equivalent to HEAD@{1}

origin    # default upstream repository
master    # default development branch

常见的使用场景

介绍git的常用场景。

克隆远程仓库

git clone https://github.com/git/git.git
git log --stat

创建新的仓库

git init
git add .
git status
git commit -m "first commit"
git remote add origin https://github.com/your/git/repo.git
git push -u origin master

查看改动内容

A git commit B git add C

以上面的图为例进行说明,A表示最后一次提交的版本,B表示最后一次追踪或暂存(stage,使用git add命令)后的版本,C表示尚未加入追踪的版本。

比较尚未追踪的文件改动和已追踪的版本,即比较C和B。

git diff

比较尚未提交但已追踪的文件改动和已提交的版本,即比较B和A。

git diff --cached

git diff --staged

取消文件跟踪或修改

如果想停止追踪已提交的文件,可以使用如下命令。下面的命令仅将文件从暂存里移除,不会删除文件。

git rm --cached file1 file2 ...

对于尚未提交的文件,也可以用git reset将文件恢复到某次提交时的状态。下面的命令仅将文件的修改从暂存里移除,不会影响到实际的文件内容。

git reset HEAD file1 file2 ...

也可使用如下命令取消文件修改,不过提交之后的所有修改内容(包括暂存的修改内容)都会丢失且不可恢复

git checkout HEAD -- file1 file2 ...

若想丢弃(不可恢复)提交后暂存的修改,可用如下命令。尚未用git add加入暂存的修改不会受影响。

git reset HEAD --hard

提交更改

git add .
git status
git commit -am "commit message"
git pull
git push origin master

修改最后一次提交

仅修改本地的提交。

git commit --amend

查看上一次提交的文件

git show HEAD^:path/to/file

命令详解

git summary

需要先安装git-extras包,可以查看repo的概况,包括时间和作者的贡献量统计等数据。

git add

git add默认情况下只更新新添加文件和修改过的文件的索引,对于不是用git rm删除的文件,会被忽略掉。可以使用git add --all选项来更新所有改动的索引。

'git add --ignore-removal ', which is the current default, ignores paths you removed from your working tree.

'git add --all ' will let you also record the removals.

git-tag

查看man页获取详细信息。

man git-tag

查看所有标签。

git tag

使用模式匹配查找标签。

git tag -l 'v1.*'

创建annotated标签。

git tag -a v1.0 -m "version 1.0"

查看刚刚添加的标签。

git show v1.0

创建使用gpg签署的标签。

git tag -s v1.5 -m "version 1.5, signed tag"

验证被签署的标签,需要有签署者的公钥。

git tag -v v1.5 

为之前的某次提交创建标签,假设该次提交的校验和是9fceb02d0ae598e95dc970b74767f19372d61af8。

git tag -a v2.0 -m "version 2.0, previous commit" 9fceb02d0ae598e95dc970b74767f19372d61af8

把某个标签推送到远程服务器上。

git push origin v2.0

把所有标签都推送到远程服务器上。

git push origin --tags

删掉远程服务器上的标签。

git tag -d v2.0
git push origin :refs/tags/v2.0

查看某个commit位于哪个tag上

git tag --contains [commit]

git-branch

查看man页获取详细信息。

man git-branch

查看所有分支,以星号(*)开头的分支为当前分支。

git branch -v

新建并切换到某一分支。

git branch issue20
git checkout issue20

git branch -b issue20

分支合并,将issue20分支并入master分支。

git checkout master
git merge issue20

删除无用的分支。

git branch -d issue20

强制删除未合并的分支。

git branch -D issue21

分支合并时遇到冲突,可参考这里的方法解决冲突后再合并。

查看已合并到当前分支的分支,通常而言,未用星号(*)标识的分支均可被删除。。

git branch --merged

查看尚未合并的分支。

git branch --no-merged 

删除远程分支

git push origin :branch-name

查看某次提交位于哪些分支上

git branch --contains cf25ac6

git-bundle

查看man页获取以详细信息。

man git-bundle

bundle命令可以对git仓库进行打包,如下所示。

cd hello-world.git
git bundle create hello-world.bundle --all

验证打包文件

git bundle verify hello-world.bundle

打包文件解包

git clone hello-world.bundle

git-log

控制git-log输出格式的选项:

选项             说明
-p               按补丁格式显示每个更新之间的差异。
--stat           显示每次更新的文件修改统计信息。
--shortstat      只显示 --stat 中最后的行数修改添加移除统计。
--name-only      仅在提交信息后显示已修改的文件清单。
--name-status    显示新增、修改、删除的文件清单。
--abbrev-commit  仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date  使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph          显示 ASCII 图形表示的分支合并历史。
--pretty         使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。

控制git-log输出范围的选项,可与以上选项同时使用:

选项               说明
-(n)               仅显示最近的 n 条提交
--since, --after   仅显示指定时间之后的提交。
--until, --before  仅显示指定时间之前的提交。
--author           仅显示指定作者相关的提交。
--committer        仅显示指定提交者相关的提交。

输出日志仅限于影响到某些文件的提交,下面的命令仅输出修改LICENSE或README的提交的日志。

git log -- LICENSE README

检索日志和修改内容

  • 检索提交消息

      git log --grep "hello world"
    
  • 检索修改内容

      git log -S "hello world"
    
  • 使用正则表达式检索修改内容

      git log -G "^hello world$"
    
  • 查找某些行内的修改

      # 10~15行内的修改
      git log -L 10,15:path/to/file 
      # 同上
      git log -L 10,+5:path/to/file
    
      # 使用.*hello匹配第一行,.*world匹配最后一行
      git log -L '/.*hello/','/.*world/':path/to/file
    

git-remote

使用man查看详细内容。

man git-retmote

查看所有的远程仓库。

git remote -v

查看某个远程仓库(short-name为其别名)的详细内容。

git remote show [short-name]

修改远程仓库的别名(short-name)。

git remote rename [short-name] [short-name]

删除远程仓库(short-name为其别名)。

git remote rm [short-name]

git-stash

将未缓存的修改暂时存储起来。

git cherry & git-cherry-pick

git cherry-pick通常用于将其他分支(A)的提交(或提交范围)提取到到当前分支(B)上,cherry-pick之后新的commitid和之前的commitid不同。

此时使用git log --graph --oneline A..B无法看到有哪些commits还没被整合到B中,但是可以使用git cherry -v B A

git cherry比较commits之间的diff结果,输出里以-开头的是已经整含到B中的commit,以+开头的则表示commit还没有整合到B中。

git-for-each-ref

输出所有的ref信息。

按时间倒序列出所有的本地branch:

git for-each-ref --sort=-authordate --format="%(authordate:iso8601) %(objectname:short) %(refname:short)" refs/heads/

按时间倒序列出所有的tag:

git for-each-ref --sort=-authordate --format="%(*authordate:iso8601) %(objectname:short) %(refname:short)" refs/tags/

git-bitsect

二分查找commit历史

git-blame

查看每一行的具体修改时间和修改人员。

git-update-index

更新git索引

git-ls-files

列出文件

-c, --cached
Show cached files in the output (default)

-d, --deleted
Show deleted files in the output

-m, --modified
Show modified files in the output

-o, --others
Show other (i.e. untracked) files in the output

-o --exclude-standard
Untracked files

使用ls-files和update-index来更新git索引

git ls-files -d -m -o -z | xargs -0 git update-index --add --remove

阅读资料

#git#教程

评论