2.3 查看提交歷史

2022-01-17 11:37 更新

查看提交歷史

在提交了若干更新,又或者克隆了某個(gè)項(xiàng)目之后,你也許想回顧下提交歷史.完成這個(gè)任務(wù)最簡(jiǎn)單而又有效的工具是 git log 命令。

接下來(lái)的例子會(huì)用我專門用于演示的 simplegit 項(xiàng)目,運(yùn)行下面的命令獲取該項(xiàng)目源代碼:

git clone https://github.com/schacon/simplegit-progit

然后在此項(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

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è)命令會(huì)列出每個(gè)提交的 SHA-1 校驗(yàn)和、作者的名字和電子郵件地址、提交時(shí)間以及提交說(shuō)明。

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

一個(gè)常用的選項(xiàng)是 -p,用來(lái)顯示每次提交的內(nèi)容差異。你也可以加上 -2 來(lái)僅顯示最近兩次提交:

$ 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,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@gee-mail.com"
     s.summary   =   "A simple gem for using Git in Ruby code."

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

    removed unnecessary test

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 所帶來(lái)的變化的時(shí)候,這個(gè)參數(shù)就非常有用了。你也可以為 git log 附帶一系列的總結(jié)性選項(xiàng)。比如說(shuō),如果你想看到每次提交的簡(jiǎn)略的統(tǒng)計(jì)信息,你可以使用 --stat 選項(xiàng):

$ 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

 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(+)

正如你所看到的,--stat 選項(xiàng)在每次提交的下面列出額所有被修改過(guò)的文件、有多少文件被修改了以及被修改過(guò)的文件的哪些行被移除或是添加了。在每次提交的最后還有一個(gè)總結(jié)。

另外一個(gè)常用的選項(xiàng)是 --pretty。這個(gè)選項(xiàng)可以指定使用不同于默認(rèn)格式的方式展示提交歷史。這個(gè)選項(xiàng)有一些內(nèi)建的子選項(xiàng)供你使用。比如用 oneline 將每個(gè)提交放在一行顯示,查看的提交數(shù)很大時(shí)非常有用。另外還有 short,fullfuller 可以用,展示的信息或多或少有些不同,請(qǐng)自己動(dòng)手實(shí)踐一下看看效果如何。

$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit

但最有意思的是 format,可以定制要顯示的記錄格式。這樣的輸出對(duì)后期提取分析格外有用?—?因?yàn)槟阒垒敵龅母袷讲粫?huì)隨著Git的更新而發(fā)生改變:

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

Table 2-1 列出了常用的格式占位符寫法及其代表的意義。

Table 2-1. git log --pretty=format 常用的選項(xiàng)
選項(xiàng)說(shuō)明

%H

提交對(duì)象(commit)的完整哈希字串

%h

提交對(duì)象的簡(jiǎn)短哈希字串

%T

樹(shù)對(duì)象(tree)的完整哈希字串

%t

樹(shù)對(duì)象的簡(jiǎn)短哈希字串

%P

父對(duì)象(parent)的完整哈希字串

%p

父對(duì)象的簡(jiǎn)短哈希字串

%an

作者(author)的名字

%ae

作者的電子郵件地址

%ad

作者修訂日期(可以用 --date= 選項(xiàng)定制格式)

%ar

作者修訂日期,按多久以前的方式顯示

%cn

提交者(committer)的名字

%ce

提交者的電子郵件地址

%cd

提交日期

%cr

提交日期,按多久以前的方式顯示

%s

提交說(shuō)明

你一定奇怪 作者提交者 之間究竟有何差別,其實(shí)作者指的是實(shí)際作出修改的人,提交者指的是最后將此工作成果提交到倉(cāng)庫(kù)的人。所以,當(dāng)你為某個(gè)項(xiàng)目發(fā)布補(bǔ)丁,然后某個(gè)核心成員將你的補(bǔ)丁并入項(xiàng)目時(shí),你就是作者,而那個(gè)核心成員就是提交者。我們會(huì)在 Chapter 5 再詳細(xì)介紹兩者之間的細(xì)微差別。

當(dāng) oneline 或 format 與另一個(gè) log 選項(xiàng) --graph 結(jié)合使用時(shí)尤其有用。這個(gè)選項(xiàng)添加了一些ASCII字符串來(lái)形象地展示你的分支、合并歷史:

$ 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

這種輸出類型會(huì)在我們下一章學(xué)完分支與合并以后變得更加有趣。

以上只是簡(jiǎn)單介紹了一些 git log 命令支持的選項(xiàng)。Table 2-2 列出了我們目前涉及到的和沒(méi)涉及到的選項(xiàng),以及它們是如何影響 log 命令的輸出的:

Table 2-2. git log 的常用選項(xiàng)
選項(xiàng)說(shuō)明

-p

按補(bǔ)丁格式顯示每個(gè)更新之間的差異。

--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(后跟指定格式)。

限制輸出長(zhǎng)度

除了定制輸出格式的選項(xiàng)之外,git log 還有許多非常實(shí)用的限制輸出長(zhǎng)度的選項(xiàng),也就是只輸出部分提交信息。之前你已經(jīng)看到過(guò) -2 了,它只顯示最近的兩條提交,實(shí)際上,這是 -<n> 選項(xiàng)的寫法,其中的 n 可以是任何整數(shù),表示僅顯示最近的若干條提交。不過(guò)實(shí)踐中我們是不太用這個(gè)選項(xiàng)的,Git 在輸出所有提交時(shí)會(huì)自動(dòng)調(diào)用分頁(yè)程序,所以你一次只會(huì)看到一頁(yè)的內(nèi)容。

另外還有按照時(shí)間作限制的選項(xiàng),比如 --since--until 也很有用。例如,下面的命令列出所有最近兩周內(nèi)的提交:

$ git log --since=2.weeks

這個(gè)命令可以在多種格式下工作,比如說(shuō)具體的某一天 "2008-01-15",或者是相對(duì)地多久以前 "2 years 1 day 3 minutes ago"。

還可以給出若干搜索條件,列出符合的提交。用 --author 選項(xiàng)顯示指定作者的提交,用 --grep 選項(xiàng)搜索提交說(shuō)明中的關(guān)鍵字。(請(qǐng)注意,如果要得到同時(shí)滿足這兩個(gè)選項(xiàng)搜索條件的提交,就必須用 --all-match 選項(xiàng)。否則,滿足任意一個(gè)條件的提交都會(huì)被匹配出來(lái))

另一個(gè)非常有用的篩選選項(xiàng)是 -S,可以列出那些添加或移除了某些字符串的提交。比如說(shuō),你想找出添加或移除了某一個(gè)特定函數(shù)的引用的提交,你可以這樣使用:

$ git log -Sfunction_name

最后一個(gè)很實(shí)用的 git log 選項(xiàng)是路徑(path),如果只關(guān)心某些文件或者目錄的歷史提交,可以在 git log 選項(xiàng)的最后指定它們的路徑。因?yàn)槭欠旁谧詈笪恢蒙系倪x項(xiàng),所以用兩個(gè)短劃線(--)隔開(kāi)之前的選項(xiàng)和后面限定的路徑名。

Table 2-3 中列出了常用的選項(xiàng)

Table 2-3. 限制 git log 輸出的選項(xiàng)
選項(xiàng)說(shuō)明

-(n)

僅顯示最近的 n 條提交

--since, --after

僅顯示指定時(shí)間之后的提交。

--until, --before

僅顯示指定時(shí)間之前的提交。

--author

僅顯示指定作者相關(guān)的提交。

--committer

僅顯示指定提交者相關(guān)的提交。

--grep

僅顯示含指定關(guān)鍵字的提交

-S

僅顯示添加或移除了某個(gè)關(guān)鍵字的提交

來(lái)看一個(gè)實(shí)際的例子,如果要查看 Git 倉(cāng)庫(kù)中,2008 年 10 月期間,Junio Hamano 提交的但未合并的測(cè)試文件,可以用下面的查詢命令:

$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
   --before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attributes are in use
acd3b9e - Enhance hold_lock_file_for_{update,append}() API
f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
51a94af - Fix "checkout --track -b newbranch" on detached HEAD
b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch 

在近40000條提交中,上面的輸出僅列出了符合條件的6條記錄。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)