在Git中,提交(commit)是用来记录版本库的变更,通常提交是由开发人员引入的,但是Git自身也会引入提交,例如合并操作自身会导致在版本库中多出一个提交。Git的大部分命令可以使用提交版本作为参数,有些命令则使用版本范围作为参数。Git能够以多种方式来指定单个提交、一组提交、或者一定范围内的提交。
单个提交
哈希值
- dae86e1950b1277e545cee180551750029cfe735:完整的SHA-1哈希值(full SHA-1)
- dae86e:缩写的SHA-1哈希值(partial SHA-1),完整的SHA-1哈希值的前几个字符,默认使用七个字符,有时为了避免SHA-1的歧义可以增加字符数(--abbrev=12)
引用
- master:本地分支名,也称为本地特性分支名
- origin/master:远程分支名,也称为远程跟踪分支名
- v1.0:标签名
- heads/master:引用相对路径
- refs/heads/master:引用绝对路径
符号引用
- HEAD:当前分支,也可以简写为@
- ORIG_HEAD:执行特定命令时备份HEAD
- FETCH_HEAD:从远程仓库抓取的远程分支
引用日志
- HEAD@{1}
- HEAD@{yesterday}
引用日志可以看作Git版的shell历史记录,重点在于仅与你和你的会话相关,而与他人无关。
引用描述
-
v1.6.2-rc1-20-g8c5b85c:git describe输出的提交描述,由最近的标签名、自该标签之后的提交数和提交的缩写SHA-1哈希值(前缀g表示Git)构成,格式为
<tag>-<num>-g<commit>
祖先引用
HEAD^或HEAD^1:上一级提交HEAD^2:上一级提交的第二个提交,只适用于合并提交,因为合并提交会有多个父提交。 合并提交的第一父提交是你合并时所在分支(通常为master),而第二父提交是你所合并的分支(例如topic)HEAD~或HEAD~1:上一级提交,HEAD~和HEAD^是等价的HEAD~2:上二级提交,HEAD~2、HEAD~~和HEAD^^是等价的
^<n>表示第n个父提交,~<n>表示连续n个符号。
一组提交
取反
^A:不在A中的提交(排除),也可以写为--not A
两点
A..B:在B中而不在A中的提交,等价于B --not A。注意:引用顺序很重要!!!
<rev1>..<rev2>
Include commits that are reachable from <rev2> but exclude those that are reachable from <rev1>. When either <rev1> or <rev2> is omitted, it defaults to HEAD.
三点
A...B:在A或B中但不是两者共有的提交(对称差),等价于A B --not $(git merge-base --all A B)。注意:引用顺序无关!!!
<rev1>...<rev2>
Include commits that are reachable from either <rev1> or <rev2> but exclude those that are reachable from both. When either <rev1> or <rev2> is omitted, it defaults to HEAD.
说明:数学上,两个集合的对称差是只属于其中一个集合,而不属于另一个集合的元素组成的集合。 集合论中的这个运算相当于布尔逻辑中的异或运算。
相关命令
git-describe - Give an object a human readable name based on an available ref
git-name-rev - Find symbolic names for given revs
git-rev-parse - Pick out and massage parameters
git-rev-list - Lists commit objects in reverse chronological order
git-merge-base - Find as good common ancestors as possible for a merge
git describe
git describe命令通过标签直观地显示提交ID,可以作为软件版本号。
$ git describe HEAD
$ git describe 610e78fc95bf2324dc5595fa684e08e1089f5757
git name-rev
git name-rev命令和git describe命令类似,将提交ID显示为友好名称。默认优先使用分支名,使用--tags优先使用标签。
$ git name-rev HEAD
$ git name-rev HEAD --tags
git rev-parse
git rev-parse命令是Git的一个底层命令,其功能非常丰富,可以将各种引用表示法转换为SHA-1哈希值。
$ git rev-parse HEAD
$ git rev-parse $(git describe HEAD)
$ git rev-parse master refs/heads/master
$ git rev-parse v1.0 refs/tags/v1.0
git rev-list
git rev-list命令可以显示版本范围。
$ git rev-list --oneline HEAD # 所有提交历史
$ git rev-list --oneline master experiment # 并集
$ git rev-list --oneline ^master experiment
$ git rev-list --oneline master..experiment
$ git rev-list --oneline master...experiment
git merge-base
git merge-base命令是Git的一个底层命令,可以找到两个或多个提交最近的共同祖先(合并基础)。
$ git merge-base master experiment
代码示例
$ git init example
$ cd example
$ git commit --allow-empty -m "A"
$ git commit --allow-empty -m "B"
$ git log --oneline
9f71568 B
07fbb1e A
# 分叉点打个标签
$ git tag -a -m "version 1.0" v1.0 9f71568
$ git checkout -b experiment
$ git commit --allow-empty -m "C"
$ git commit --allow-empty -m "D"
$ git checkout master
$ git commit --allow-empty -m "E"
$ git commit --allow-empty -m "F"
$ git branch
experiment
* master
$ git tag
v1.0
#############
$ git describe HEAD
v1.0-2-gb12eb3c
$ git name-rev HEAD
HEAD master
$ git rev-parse HEAD
b12eb3c0a3f3662eac0a2ad90a29c58e1b3df34f
$ git rev-parse $(git describe HEAD)
b12eb3c0a3f3662eac0a2ad90a29c58e1b3df34f
$ git rev-parse master refs/heads/master
b12eb3c0a3f3662eac0a2ad90a29c58e1b3df34f
b12eb3c0a3f3662eac0a2ad90a29c58e1b3df34f
$ git rev-parse v1.0 refs/tags/v1.0
c15686b54691f53edde256ac40a3f05f76a0e4c5
c15686b54691f53edde256ac40a3f05f76a0e4c5
# 分支所有提交历史
$ git rev-list --oneline HEAD
b12eb3c F
52b041a E
9f71568 B
07fbb1e A
# 最近的共同祖先
$ git log --oneline -1 $(git merge-base master experiment)
9f71568 B
$ git rev-list --oneline master experiment
b12eb3c F
52b041a E
1fa4412 D
fdedf69 C
9f71568 B
07fbb1e A
$ git rev-list --oneline ^master experiment
1fa4412 D
fdedf69 C
$ git rev-list --oneline master..experiment
1fa4412 D
fdedf69 C
$ git rev-list --oneline master...experiment
b12eb3c F
52b041a E
1fa4412 D
fdedf69 C
参考资料
Git - gitrevisions Documentation
《Git版本控制管理(第2版)》
《Git高手之路》