檢視提交歷史 —— Git 學習筆記 11

ARM的程式設計師敲著詩歌的夢發表於2018-09-07

檢視提交歷史

在提交了若干更新,又或者克隆了某個專案之後,你也許想回顧下提交歷史。 完成這個任務最簡單而又有效的
工具是 git log 命令。

接下來的例子會用一個用於演示的 simplegit 專案, 執行下面的命令獲取該專案原始碼:

git clone https://github.com/schacon/simplegit-progit
Cloning into 'simplegit-progit'...
remote: Counting objects: 13, done.
remote: Total 13 (delta 0), reused 0 (delta 0), pack-reused 13
Unpacking objects: 100% (13/13), done.

克隆完成後,當前目錄下會多出一個資料夾 simplegit-progit

$ cd simplegit-progit/
$ ls
lib/  Rakefile  README

不帶任何選項的git log

執行 git log,應該會看到下面的輸出:

$ git log
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the verison number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit

預設不用任何引數的話,git log 會按提交時間列出所有的更新,最近的更新排在最上面。 正如你所看到的,這個命令會列出每個提交的 SHA-1 校驗和、作者的名字和電子郵件地址、提交時間以及提交說明。

也許你會疑惑第二行的(HEAD -> master, origin/master, origin/HEAD),我的理解是:

雖然遠端倉庫沒有工作目錄,但是依然可以有 HEAD 指標,即origin/HEAD。這個 HEAD 指標指向遠端倉庫的預設分支,當克隆遠端倉庫的時候,只有這個預設分支會被克隆,克隆後就是本地的 master 分支。HEAD -> master表示當前在 master 分支上。

git log 有許多選項可以幫助你搜尋你所要找的提交, 接下來我們介紹些最常用的。

-p選項

一個常用的選項是 -p,用來顯示每次提交的內容差異。 你也可以加上 -2 來僅顯示最近兩次提交:

$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the verison number

diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
 spec = Gem::Specification.new do |s|
     s.platform  =   Gem::Platform::RUBY
     s.name      =   "simplegit"
-    s.version   =   "0.1.0"
+    s.version   =   "0.1.1"
     s.author    =   "Scott Chacon"
     s.email     =   "schacon@gmail.com"
     s.summary   =   "A simple gem for using Git in Ruby code."

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae..47c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
     end

 end
-
-if $0 == __FILE__
-  git = SimpleGit.new
-  puts git.show
-end
\ No newline at end of file

該選項除了顯示基本資訊之外,還附帶了每次 commit 的變化。 當進行程式碼審查,或者快速瀏覽某個同事提交
的 commit 所帶來的變化的時候,這個引數就非常有用了。

--stat 選項

如果你覺得這些資訊太囉嗦,那麼可以為 git log 附帶一系列的總結性選項。比如說,如果想看每次提交的簡略統計資訊,可以使用 --stat 選項:

$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the verison number

 Rakefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

 lib/simplegit.rb | 5 -----
 1 file changed, 5 deletions(-)

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit

 README           |  6 ++++++
 Rakefile         | 23 +++++++++++++++++++++++
 lib/simplegit.rb | 25 +++++++++++++++++++++++++
 3 files changed, 54 insertions(+)
(END)

正如你所看到的,--stat 選項在每次提交的下面列出所有被修改過的檔案、有多少檔案被修改了以及被修改過
的檔案有多少行被修改了(刪除或者新增)。 在每次提交的最後還有一個總結——有幾個檔案被修改,一共增加了幾行,刪除了幾行。

--pretty=oneline選項

另外一個常用的選項是 --pretty。 這個選項可以指定使用不同於預設格式的方式展示提交歷史。 這個選項有
一些內建的子選項供你使用。 比如用 oneline 將每個提交放在一行顯示,當檢視的提交數很大時非常有用。

$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD) changed the verison number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit

--pretty=format選項

最有意思的是 format,可以定製要顯示的記錄格式。比如:

$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 10 years ago : changed the verison number
085bb3b - Scott Chacon, 10 years ago : removed unnecessary test code
a11bef0 - Scott Chacon, 10 years ago : first commit

git log --pretty=format 常用的選項有:
這裡寫圖片描述

你一定奇怪 “作者” 和 “提交者” 之間究竟有何差別, 其實作者指的是實際作出修改的人,提交者指的是最後將此工
作成果提交到倉庫的人。 所以,當你為某個專案釋出補丁,然後某個核心成員將你的補丁併入專案時,你就是
作者,而那個核心成員就是提交者。

當 oneline 或 format 與另一個 log 選項 --graph 結合使用時,Git 會用一些ASCII字串來形象地展示你的分支、合併歷史:

$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
*  5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
*  11d191e Merge branch 'defunkt' into local

git log常用選項列表

以上只是簡單介紹了一些 git log 命令支援的選項。 下表中的 git log 常用選項列出了我們目前涉及到的和沒涉及到的選項,以及它們是如何影響 log 命令的輸出的:
這裡寫圖片描述


參考資料

《精通Git(第2版)》,Scott Chacon & Ben Straub,人民郵電出版社

相關文章