选择修订版本
使用简短的SHA-1
关于什么是SHA-1,参照如下log命令的结果,其中每一个提交都有一串无意义的随机字母数字字符串,这就是SHA-1。它可以确定每一个提交都有一个不同的可识别ID。
$ Git log
commit 4416a2c9d6c5c010d42a2326170c4a9ddd54cbd3 (HEAD -> master, origin/master, origin/HEAD)
Merge: c7a8ec8 7957b99
Author: kutilion <kutilion@gmail.com>
Date: Wed Apr 3 22:56:58 2019 +0800
fix conflict
commit 7957b99d73b8e2782aed8c327359ade6aaf7f6eb (testing)
Author: kutilion <kutilion@gmail.com>
Date: Wed Apr 3 22:47:14 2019 +0800
changed by testing branch
如果想取得特定的提交,可以使用SHA-1。如下的两个命令是等价的,因为git支持缩短的SHA-1编码。
$ git show 7957b99d73b8e2782aed8c327359ade6aaf7f6eb
$ git show 7957b
当然,越庞大的项目,拥有的提交就越多,那么缩短的SHA-1的位数就要相应的增加,以确定唯一性。
引用日志
Git 会在后台保存一个引用日志(reflog),记录了最近几个月你的 HEAD 和分支引用所指向的履历。
$ git reflog
4416a2c (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: commit (merge): fix conflict
c7a8ec8 HEAD@{1}: checkout: moving from testing to master
7957b99 (testing) HEAD@{2}: commit: changed by testing branch
812b289 HEAD@{3}: checkout: moving from master to testing
c7a8ec8 HEAD@{4}: commit: changed by master branch
812b289 HEAD@{5}: checkout: moving from testing to master
812b289 HEAD@{6}: checkout: moving from master to testing
812b289 HEAD@{7}: merge testing: Fast-forward
6fa2268 (tag: v1.0) HEAD@{8}: checkout: moving from testing to master
812b289 HEAD@{9}: commit: made a change
6fa2268 (tag: v1.0) HEAD@{10}: checkout: moving from master to testing
6fa2268 (tag: v1.0) HEAD@{11}: commit (amend): combine commit second time
fec3551 HEAD@{12}: commit (amend): combine commit
a3191d2 HEAD@{13}: commit: normalCommit.txt
c4bea31 (tag: v0.9) HEAD@{14}: commit: First commit
6e2fa09 (gtNew/master) HEAD@{15}: clone: from
上述示例显示了全部的履历。如果希望指定某次提交,可以使用如下命令
$ git show HEAD@{1}
commit c7a8ec8a7a0941ec3301859d715dae6e9f6ab8ba
Author: kutilion <kutilion@gmail.com>
Date: Wed Apr 3 22:45:58 2019 +0800
changed by master branch
diff --git a b
index fa49b07..9161f20 100644
--- a
+++ b
@@ -1 +1,2 @@
new file
+changed by master branch
\ No newline at end of file
注意,引用日志只针对本地操作。这也是这个命令不太实用的原因。
祖先引用
祖先引用是另一种指明一个提交的方式。 如果你在引用的尾部加上一个 ^, Git 会将其解析为该引用的上一个提交。下面是全部的提交历史。
$ git log --pretty=format:'%h %s' --graph
* 4416a2c fix conflict
|\
| * 7957b99 changed by testing branch
* | c7a8ec8 changed by master branch
|/
* 812b289 made a change
* 6fa2268 combine commit second time
* c4bea31 First commit
* 6e2fa09 Initial commit
可以使用HEAD^来查看上一个提交(父提交)。
$ git show HEAD^
commit c7a8ec8a7a0941ec3301859d715dae6e9f6ab8ba
Author: kutilion <kutilion@gmail.com>
Date: Wed Apr 3 22:45:58 2019 +0800
changed by master branch
diff --git a b
index fa49b07..9161f20 100644
--- a
+++ b
@@ -1 +1,2 @@
new file
+changed by master branch
\ No newline at end of file
如果是合并提交,那么它会有两个父提交。命令可以在后面加上数字来指定是哪一个。第一父提交是所在分支,第二父提交指定被合并的分支。如:
第一父提交
$ git show 4416a2c^
commit c7a8ec8a7a0941ec3301859d715dae6e9f6ab8ba
Author: kutilion <kutilion@gmail.com>
Date: Wed Apr 3 22:45:58 2019 +0800
changed by master branch
diff --git a b
index fa49b07..9161f20 100644
--- a
+++ b
@@ -1 +1,2 @@
new file
+changed by master branch
第二父提交
$ git show 4416a2c^2
commit 7957b99d73b8e2782aed8c327359ade6aaf7f6eb (testing)
Author: kutilion <kutilion@gmail.com>
Date: Wed Apr 3 22:47:14 2019 +0800
changed by testing branch
diff --git a b
index fa49b07..53099b9 100644
--- a
+++ b
@@ -1 +1,2 @@
new file
+changed by tesing branch
\ No newline at end of file
另外命令中还可以使用~符号。如下面的两个命令是等价的。表示太爷爷辈的提交。
$ git show HEAD~3
$ git show HEAD^^^
提交区间
当有多个分支时可以通过如下命令来查询分支间相互不同的提交。比如
$ git log master..testing
查询testing分支有哪些提交没有反映到master分支上。相反,如下命令查询testing分支中所没有的master分支的提交
$ git log testing..master
commit 4416a2c9d6c5c010d42a2326170c4a9ddd54cbd3 (HEAD -> master, origin/master, origin/HEAD)
Merge: c7a8ec8 7957b99
Author: kutilion <kutilion@gmail.com>
Date: Wed Apr 3 22:56:58 2019 +0800
fix conflict
commit c7a8ec8a7a0941ec3301859d715dae6e9f6ab8ba
Author: kutilion <kutilion@gmail.com>
Date: Wed Apr 3 22:45:58 2019 +0800
changed by master branch
可以看到,master分支是主分支,提交必然会比testing分支多。所以上面的两个命令输出结果是不同的。
上述方式是双点查询。下面介绍多点查询。
比如,你想查看所有被 refA 或 refB 包含的但是不被 refC 包含的提交,你可以输入下面中的任意一个命令,它们是等价的。
$ git log refA refB ^refC
$ git log refA refB --not refC
最后是三点查询
$ git log master...testing
commit 4416a2c9d6c5c010d42a2326170c4a9ddd54cbd3 (HEAD -> master, origin/master, origin/HEAD)
Merge: c7a8ec8 7957b99
Author: kutilion <kutilion@gmail.com>
Date: Wed Apr 3 22:56:58 2019 +0800
fix conflict
commit c7a8ec8a7a0941ec3301859d715dae6e9f6ab8ba
Author: kutilion <kutilion@gmail.com>
Date: Wed Apr 3 22:45:58 2019 +0800
changed by master branch
这个结果看起来和双点查询的git log testing..master的差不多。其实三点查询是列出不同分支中的不同提交。因为testing的提交都被合并到master中了,所以不存在和master不同的提交。但是master中存在与testing不同的提交。
$ git log --left-right master...testing
commit < 4416a2c9d6c5c010d42a2326170c4a9ddd54cbd3 (HEAD -> master, origin/master, origin/HEAD)
Merge: c7a8ec8 7957b99
Author: kutilion <kutilion@gmail.com>
Date: Wed Apr 3 22:56:58 2019 +0800
fix conflict
commit < c7a8ec8a7a0941ec3301859d715dae6e9f6ab8ba
Author: kutilion <kutilion@gmail.com>
Date: Wed Apr 3 22:45:58 2019 +0800
changed by master branch
--left-right参数可以显示提交是哪一个分支的。不如上面的示例,表示显示出的提交都是master的,因为有 < 符号。当然,如果有testing分支的提交,则会显示 >。
以上的介绍都是针对的本地。很多时候需要和远程的仓库的某个分支比较提交是否不同,那么可以使用如下命令。以双点提交为例:
$ git log origin/master..HEAD
commit 013c1ed1006d469d59cf72b80925cba15ee051ca (HEAD -> master)
Author: kutilion <kutilion@gmail.com>
Date: Mon Apr 8 21:36:13 2019 +0800
git log
显示了本地存在,但是远程仓库不存在的提交。