在提交了若干更新之后,又或者克隆了某個(gè)項(xiàng)目,想回顧下提交歷史,可以使用 git log
命令查看。
接下來的例子會(huì)用我專門用于演示的 simplegit 項(xiàng)目,運(yùn)行下面的命令獲取該項(xiàng)目源代碼:
git clone git://github.com/schacon/simplegit-progit.git
然后在此項(xiàng)目中運(yùn)行 git log
,應(yīng)該會(huì)看到下面的輸出:
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test code
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
first commit
默認(rèn)不用任何參數(shù)的話,git log
會(huì)按提交時(shí)間列出所有的更新,最近的更新排在最上面??吹搅藛?,每次更新都有一個(gè) SHA-1 校驗(yàn)和、作者的名字和電子郵件地址、提交時(shí)間,最后縮進(jìn)一個(gè)段落顯示提交說明。
git log
有許多選項(xiàng)可以幫助你搜尋感興趣的提交,接下來我們介紹些最常用的。
我們常用 -p
選項(xiàng)展開顯示每次提交的內(nèi)容差異,用 -2
則僅顯示最近的兩次更新:
$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,5 +5,5 @@ require 'rake/gempackagetask'
spec = Gem::Specification.new do |s|
s.name = "simplegit"
- s.version = "0.1.0"
+ s.version = "0.1.1"
s.author = "Scott Chacon"
s.email = "schacon@gee-mail.com"
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.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
該選項(xiàng)除了顯示基本信息之外,還在附帶了每次 commit 的變化。當(dāng)進(jìn)行代碼審查,或者快速瀏覽某個(gè)搭檔提交的 commit 的變化的時(shí)候,這個(gè)參數(shù)就非常有用了。
某些時(shí)候,單詞層面的對(duì)比,比行層面的對(duì)比,更加容易觀察。Git 提供了 --word-diff
選項(xiàng)。我們可以將其添加到 git log -p
命令的后面,從而獲取單詞層面上的對(duì)比。在程序代碼中進(jìn)行單詞層面的對(duì)比常常是沒什么用的。不過當(dāng)你需要在書籍、論文這種很大的文本文件上進(jìn)行對(duì)比的時(shí)候,這個(gè)功能就顯出用武之地了。下面是一個(gè)簡(jiǎn)單的例子:
$ git log -U1 --word-diff
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -7,3 +7,3 @@ spec = Gem::Specification.new do |s|
s.name = "simplegit"
s.version = [-"0.1.0"-]{+"0.1.1"+}
s.author = "Scott Chacon"
如你所見,這里并沒有平常看到的添加行或者刪除行的信息。這里的對(duì)比顯示在行間。新增加的單詞被 {+ +}
括起來,被刪除的單詞被 [- -]
括起來。在進(jìn)行單詞層面的對(duì)比的時(shí)候,你可能希望上下文( context )行數(shù)從默認(rèn)的 3 行,減為 1 行,那么可以使用 -U1 選項(xiàng)。上面的例子中,我們就使用了這個(gè)選項(xiàng)。
另外,git log
還提供了許多摘要選項(xiàng)可以用,比如 --stat
,僅顯示簡(jiǎn)要的增改行數(shù)統(tǒng)計(jì):
$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
Rakefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.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@gee-mail.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(+)
每個(gè)提交都列出了修改過的文件,以及其中添加和移除的行數(shù),并在最后列出所有增減行數(shù)小計(jì)。 還有個(gè)常用的 --pretty
選項(xiàng),可以指定使用完全不同于默認(rèn)格式的方式展示提交歷史。比如用 oneline 將每個(gè)提交放在一行顯示,這在提交數(shù)很大時(shí)非常有用。另外還有 short,full 和 fuller
可以用,展示的信息或多或少有些不同,請(qǐng)自己動(dòng)手實(shí)踐一下看看效果如何。
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
但最有意思的是 format,可以定制要顯示的記錄格式,這樣的輸出便于后期編程提取分析,像這樣:
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 11 months ago : changed the version number
085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
a11bef0 - Scott Chacon, 11 months ago : first commit
表 2-1 列出了常用的格式占位符寫法及其代表的意義。
選項(xiàng) | 說明 |
---|---|
%H | 提交對(duì)象(commit)的完整哈希字串 |
%h | 提交對(duì)象的簡(jiǎn)短哈希字串 |
%T | 樹對(duì)象(tree)的完整哈希字串 |
%t | 樹對(duì)象的簡(jiǎn)短哈希字串 |
%P | 父對(duì)象(parent)的完整哈希字串 |
%p | 父對(duì)象的簡(jiǎn)短哈希字串 |
%an | 作者(author)的名字 |
%ae | 作者的電子郵件地址 |
%ad | 作者修訂日期(可以用 -date= 選項(xiàng)定制格式) |
%ar | 作者修訂日期,按多久以前的方式顯示 |
%cn | 提交者(committer)的名字 |
%ce | 提交者的電子郵件地址 |
%cd | 提交日期 |
%cr | 提交日期,按多久以前的方式顯示 |
%s | 提交說明 |
你一定奇怪作者(author)和提交者(committer)之間究竟有何差別,其實(shí)作者指的是實(shí)際作出修改的人,提交者指的是最后將此工作成果提交到倉(cāng)庫(kù)的人。所以,當(dāng)你為某個(gè)項(xiàng)目發(fā)布補(bǔ)丁,然后某個(gè)核心成員將你的補(bǔ)丁并入項(xiàng)目時(shí),你就是作者,而那個(gè)核心成員就是提交者。我們會(huì)在第五章再詳細(xì)介紹兩者之間的細(xì)微差別。
用 oneline
或 format
時(shí)結(jié)合 --graph
選項(xiàng),可以看到開頭多出一些 ASCII 字符串表示的簡(jiǎn)單圖形,形象地展示了每個(gè)提交所在的分支及其分化衍合情況。在我們之前提到的 Grit 項(xiàng)目倉(cāng)庫(kù)中可以看到:
$ 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
以上只是簡(jiǎn)單介紹了一些 git log
命令支持的選項(xiàng)。表 2-2 還列出了一些其他常用的選項(xiàng)及其釋義。
選項(xiàng) | 說明 |
---|---|
-p | 按補(bǔ)丁格式顯示每個(gè)更新之間的差異。 |
--word-diff | 按 word diff 格式顯示差異。 |
--stat | 顯示每次更新的文件修改統(tǒng)計(jì)信息。 |
--shortstat | 只顯示 --stat 中最后的行數(shù)修改添加移除統(tǒng)計(jì)。 |
--name-only | 僅在提交信息后顯示已修改的文件清單。 |
--name-status | 顯示新增、修改、刪除的文件清單。 |
--abbrev-commit | 僅顯示 SHA-1 的前幾個(gè)字符,而非所有的 40 個(gè)字符。 |
--relative-date | 使用較短的相對(duì)時(shí)間顯示(比如,“2 weeks ago”)。 |
--graph | 顯示 ASCII 圖形表示的分支合并歷史。 |
--pretty | 使用其他格式顯示歷史提交信息??捎玫倪x項(xiàng)包括 oneline,short,full,fuller 和 format(后跟指定格式)。 |
--oneline | --pretty=oneline --abbrev-commit 的簡(jiǎn)化用法。 |
除了定制輸出格式的選項(xiàng)之外,git log
還有許多非常實(shí)用的限制輸出長(zhǎng)度的選項(xiàng),也就是只輸出部分提交信息。之前我們已經(jīng)看到過 -2
了,它只顯示最近的兩條提交,實(shí)際上,這是 -<n>
選項(xiàng)的寫法,其中的 n 可以是任何自然數(shù),表示僅顯示最近的若干條提交。不過實(shí)踐中我們是不太用這個(gè)選項(xiàng)的,Git 在輸出所有提交時(shí)會(huì)自動(dòng)調(diào)用分頁(yè)程序(less),要看更早的更新只需翻到下頁(yè)即可。
另外還有按照時(shí)間作限制的選項(xiàng),比如 --since
和 --until
。下面的命令列出所有最近兩周內(nèi)的提交:
$ git log --since=2.weeks
你可以給出各種時(shí)間格式,比如說具體的某一天(“2008-01-15”),或者是多久以前(“2 years 1 day 3 minutes ago”)。
還可以給出若干搜索條件,列出符合的提交。用 --author
選項(xiàng)顯示指定作者的提交,用 --grep
選項(xiàng)搜索提交說明中的關(guān)鍵字。(請(qǐng)注意,如果要得到同時(shí)滿足這兩個(gè)選項(xiàng)搜索條件的提交,就必須用 --all-match
選項(xiàng)。否則,滿足任意一個(gè)條件的提交都會(huì)被匹配出來)
另一個(gè)真正實(shí)用的git log
選項(xiàng)是路徑(path),如果只關(guān)心某些文件或者目錄的歷史提交,可以在 git log
選項(xiàng)的最后指定它們的路徑。因?yàn)槭欠旁谧詈笪恢蒙系倪x項(xiàng),所以用兩個(gè)短劃線(--)隔開之前的選項(xiàng)和后面限定的路徑名。
表 2-3 還列出了其他常用的類似選項(xiàng)。
選項(xiàng) | 說明 |
---|---|
-(n) | 僅顯示最近的 n 條提交 |
--since, --after | 僅顯示指定時(shí)間之后的提交。 |
--until, --before | 僅顯示指定時(shí)間之前的提交。 |
--author | 僅顯示指定作者相關(guān)的提交。 |
--committer | 僅顯示指定提交者相關(guān)的提交。 |
來看一個(gè)實(shí)際的例子,如果要查看 Git 倉(cāng)庫(kù)中,2008 年 10 月期間,Junio Hamano 提交的但未合并的測(cè)試腳本(位于項(xiàng)目的 t/ 目錄下的文件),可以用下面的查詢命令:
$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
--before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attribute
acd3b9e - Enhance hold_lock_file_for_{update,append}()
f563754 - demonstrate breakage of detached checkout wi
d1a43f2 - reset --hard/read-tree --reset -u: remove un
51a94af - Fix "checkout --track -b newbranch" on detac
b0ad11e - pull: allow "git pull origin $something:$cur
Git 項(xiàng)目有 20,000 多條提交,但我們給出搜索選項(xiàng)后,僅列出了其中滿足條件的 6 條。
有時(shí)候圖形化工具更容易展示歷史提交的變化,隨 Git 一同發(fā)布的 gitk 就是這樣一種工具。它是用 Tcl/Tk 寫成的,基本上相當(dāng)于 git log
命令的可視化版本,凡是 git log
可以用的選項(xiàng)也都能用在 gitk 上。在項(xiàng)目工作目錄中輸入 gitk
命令后,就會(huì)啟動(dòng)圖 2-2 所示的界面。
更多建議: