Git 提交歷史記錄

1、查看舊提交
在參數形式上,git log 和 git log HEAD 是同樣的,輸出每個能夠從 HEAD 找到的歷史記錄中的提交日誌消息。注意當回溯歷史記錄的時候,Git 是依附於提交圖的,而不是時間。git

限制歷史記錄的一種技術是使用 since..until 這樣的形式來指定提交的範圍。給定一個範圍,git log 將會把在 since 到 until 之間的全部提交顯示出來。下面給出一個例子。web

$ git log --pretty=short --abbrev-commit master~5..master~3
commit eac5baa
Author: Jon Loeliger <jdl@spcial-project.example.org>

moved data to mydata

commit 01f0226
Author: Jon Loeliger <jdl@spcial-project.example.org>

moved data to newdata

這裏 git log 顯示了在 master~5 到 master~3 之間的全部提交,就是主分支上以前第4次和第5次提交。
前面例子引入的格式 –pretty=short 調整了每一個提交的信息數量,而且還有其餘幾個選項,包括 online、short 和 full。–abbrev-commit 只是簡單的請求縮寫散列ID。svg

使用 -p 選項來輸出提交引進的補丁或變動。工具

$ git log -1 -p eac5baa
commit eac5baa1040a823a19d62c485566d692595bd1e5
Author: Jon Loeliger <jdl@spcial-project.example.org>
Date:   Sat Aug 5 10:30:20 2017 +0800

moved data to mydata

diff --git a/mydata b/mydata
new file mode 100644
index 0000000..a3c9c79
--- /dev/null
+++ b/mydata
@@ -0,0 +1,2 @@
+new data
+and some more data now
\ No newline at end of file

-1也是一個不錯的選擇,它會輸出限制爲一個提交。也可使用 -n 來將輸出限制爲最多 n 個提交。3d

–stat 選項列舉了提交中所更改的文件以及每一個提交的文件中有多少行作了改動。日誌

$ git log --pretty=short --stat master~3..master~1
commit e818fb29279add451d130af367ee2e58e8851ca9
Author: Jon Loeliger <jdl@spcial-project.example.org>

add hello.txt

 hello.txt | 1 +
 1 file changed, 1 insertion(+)

commit 726f3d32595255e243925ed1177fb621122a3508
Author: Jon Loeliger <jdl@spcial-project.example.org>

delete newdata

 newdata | 2 --
 1 file changed, 2 deletions(-)

另外一個查看對象庫中的對象信息的命令是 git show。可使用它來查看某個提交。code

$ git show HEAD~2

或者查看某個特定的 blob 對象信息。xml

$ git show origin/master:Makefile

顯示的是 origin/master 分支的 Makefile blob。對象

2、提價圖
Git 使用的一種——有向無環圖(DAG)。
一些工具,如 gitk 和 git show-branch 能夠將提交歷史記錄形象地表現出來。在使用這些工具時,時間抽一般是自下向上。blog

使用 gitk 來查看提交圖

$ cd new
$ gitk

gitk截圖

3、提交範圍
許多 Git 命令都容許指定提交範圍。
雙句點(..)形式就表示一個範圍。一般狀況下,提交範圍用來檢查某個分支或分支的一部分。
當使用 git log 命令並指定 Y 提交時,其實是要求 Git 給出 Y 提交可達的全部提交的日誌。能夠經過表達式 ^X 排除可達交集中的提交 X。
結合這兩種形式,git log ^X Y 就等同於 git log X..Y。從數學上來說,也能夠認爲它是集合減法:用 Y 以前的全部提交減去 X 之間的全部提交且包括 X。

加入分支和合並後,範圍 topic..master 表示在 master 分支而不在 topic 分支的提交。
還有其餘兩種範圍表示方法,若是省略 start 或者 end,就默認用 HEAD 代替。所以, ..end 等價於 HEAD..endstart.. 等價於 start..HEAD。

只有形如 start ..end 的範圍才表示集合的減法運算,而 A…B (三個句點)表示 A 和 B 之間的對稱差,也就是 A 或 B 可達 但又不是 A 和 B 同時可達的提交集合。