git 历史操作日志_Git - 查看提交历史
查看提交歷史
在提交了若干更新,又或者克隆了某個(gè)項(xiàng)目之后,你也許想回顧下提交歷史。
完成這個(gè)任務(wù)最簡(jiǎn)單而又有效的工具是 git log 命令。
我們使用一個(gè)非常簡(jiǎn)單的 “simplegit” 項(xiàng)目作為示例。
運(yùn)行下面的命令獲取該項(xiàng)目:
$ git clone https://github.com/schacon/simplegit-progit
當(dāng)你在此項(xiàng)目中運(yùn)行 git log 命令時(shí),可以看到下面的輸出:
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon
Date: Sat Mar 15 10:31:28 2008 -0700
first commit
不傳入任何參數(shù)的默認(rèn)情況下,git log 會(huì)按時(shí)間先后順序列出所有的提交,最近的更新排在最上面。
正如你所看到的,這個(gè)命令會(huì)列出每個(gè)提交的 SHA-1 校驗(yàn)和、作者的名字和電子郵件地址、提交時(shí)間以及提交說(shuō)明。
git log 有許多選項(xiàng)可以幫助你搜尋你所要找的提交,
下面我們會(huì)介紹幾個(gè)最常用的選項(xiàng)。
其中一個(gè)比較有用的選項(xiàng)是 -p 或 --patch ,它會(huì)顯示每次提交所引入的差異(按 補(bǔ)丁 的格式輸出)。
你也可以限制顯示的日志條目數(shù)量,例如使用 -2 選項(xiàng)來(lái)只顯示最近的兩次提交:
$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon
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
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
該選項(xiàng)除了顯示基本信息之外,還附帶了每次提交的變化。
當(dāng)進(jìn)行代碼審查,或者快速瀏覽某個(gè)搭檔的提交所帶來(lái)的變化的時(shí)候,這個(gè)參數(shù)就非常有用了。
你也可以為 git log 附帶一系列的總結(jié)性選項(xiàng)。
比如你想看到每次提交的簡(jiǎn)略統(tǒng)計(jì)信息,可以使用 --stat 選項(xiàng):
$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon
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
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
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 會(huì)將每個(gè)提交放在一行顯示,在瀏覽大量的提交時(shí)非常有用。
另外還有 short,full 和 fuller 選項(xiàng),它們展示信息的格式基本一致,但是詳盡程度不一:
$ 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
git log --pretty=format 常用的選項(xiàng) 列出了 format 接受的常用格式占位符的寫法及其代表的意義。
Table 1. git log --pretty=format 常用的選項(xiàng)
選項(xiàng)
說(shuō)明
%H
提交的完整哈希值
%h
提交的簡(jiǎn)寫哈希值
%T
樹的完整哈希值
%t
樹的簡(jiǎn)寫哈希值
%P
父提交的完整哈希值
%p
父提交的簡(jiǎn)寫哈希值
%an
作者名字
%ae
作者的電子郵件地址
%ad
作者修訂日期(可以用 --date=選項(xiàng) 來(lái)定制格式)
%ar
作者修訂日期,按多久以前的方式顯示
%cn
提交者的名字
%ce
提交者的電子郵件地址
%cd
提交日期
%cr
提交日期(距今多長(zhǎng)時(shí)間)
%s
提交說(shuō)明
你一定奇怪 作者 和 提交者 之間究竟有何差別,
其實(shí)作者指的是實(shí)際作出修改的人,提交者指的是最后將此工作成果提交到倉(cāng)庫(kù)的人。
所以,當(dāng)你為某個(gè)項(xiàng)目發(fā)布補(bǔ)丁,然后某個(gè)核心成員將你的補(bǔ)丁并入項(xiàng)目時(shí),你就是作者,而那個(gè)核心成員就是提交者。
我們會(huì)在 分布式 Git 再詳細(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)。
git log 的常用選項(xiàng) 列出了我們目前涉及到的和沒(méi)涉及到的選項(xiàng),以及它們是如何影響 log 命令的輸出的:
Table 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 校驗(yàn)和所有 40 個(gè)字符中的前幾個(gè)字符。
--relative-date
使用較短的相對(duì)時(shí)間而不是完整格式顯示日期(比如“2 weeks ago”)。
--graph
在日志旁以 ASCII 圖形顯示分支與合并歷史。
--pretty
使用其他格式顯示歷史提交信息。可用的選項(xiàng)包括 oneline、short、full、fuller 和 format(用來(lái)定義自己的格式)。
--oneline
--pretty=oneline --abbrev-commit 合用的簡(jiǎn)寫。
限制輸出長(zhǎng)度
除了定制輸出格式的選項(xiàng)之外,git log 還有許多非常實(shí)用的限制輸出長(zhǎng)度的選項(xiàng),也就是只輸出一部分的提交。
之前你已經(jīng)看到過(guò) -2 選項(xiàng)了,它只會(huì)顯示最近的兩條提交,
實(shí)際上,你可以使用類似 - 的選項(xiàng),其中的 n 可以是任何整數(shù),表示僅顯示最近的 n 條提交。
不過(guò)實(shí)踐中這個(gè)選項(xiàng)不是很常用,因?yàn)?Git 默認(rèn)會(huì)將所有的輸出傳送到分頁(yè)程序中,所以你一次只會(huì)看到一頁(yè)的內(nèi)容。
但是,類似 --since 和 --until 這種按照時(shí)間作限制的選項(xiàng)很有用。
例如,下面的命令會(huì)列出最近兩周的所有提交:
$ git log --since=2.weeks
該命令可用的格式十分豐富——可以是類似 "2008-01-15" 的具體的某一天,也可以是類似 "2 years 1 day 3 minutes ago" 的相對(duì)日期。
還可以過(guò)濾出匹配指定條件的提交。
用 --author 選項(xiàng)顯示指定作者的提交,用 --grep 選項(xiàng)搜索提交說(shuō)明中的關(guān)鍵字。
Note
你可以指定多個(gè) --author 和 --grep 搜索條件,這樣會(huì)只輸出 任意 匹配
--author 模式和 --grep 模式的提交。然而,如果你添加了 --all-match 選項(xiàng),
則只會(huì)輸出 所有 匹配 --grep 模式的提交。
另一個(gè)非常有用的過(guò)濾器是 -S(俗稱“pickaxe”選項(xiàng),取“用鶴嘴鋤在土里撿石頭”之意),
它接受一個(gè)字符串參數(shù),并且只會(huì)顯示那些添加或刪除了該字符串的提交。
假設(shè)你想找出添加或刪除了對(duì)某一個(gè)特定函數(shù)的引用的提交,可以調(diào)用:
$ git log -S function_name
最后一個(gè)很實(shí)用的 git log 選項(xiàng)是路徑(path),
如果只關(guān)心某些文件或者目錄的歷史提交,可以在 git log 選項(xiàng)的最后指定它們的路徑。
因?yàn)槭欠旁谧詈笪恢蒙系倪x項(xiàng),所以用兩個(gè)短劃線(--)隔開之前的選項(xiàng)和后面限定的路徑名。
Table 3. 限制 git log 輸出的選項(xiàng)
選項(xiàng)
說(shuō)明
-
僅顯示最近的 n 條提交。
--since, --after
僅顯示指定時(shí)間之后的提交。
--until, --before
僅顯示指定時(shí)間之前的提交。
--author
僅顯示作者匹配指定字符串的提交。
--committer
僅顯示提交者匹配指定字符串的提交。
--grep
僅顯示提交說(shuō)明中包含指定字符串的提交。
-S
僅顯示添加或刪除內(nèi)容匹配指定字符串的提交。
來(lái)看一個(gè)實(shí)際的例子,如果要在 Git 源碼庫(kù)中查看 Junio Hamano 在 2008 年 10 月其間,
除了合并提交之外的哪一個(gè)提交修改了測(cè)試文件,可以使用下面的命令:
$ git log --pretty="%h - %s" --author='Junio C Hamano' --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 條記錄。
Tip
隱藏合并提交
按照你代碼倉(cāng)庫(kù)的工作流程,記錄中可能有為數(shù)不少的合并提交,它們所包含的信息通常并不多。
為了避免顯示的合并提交弄亂歷史記錄,可以為 log 加上 --no-merges 選項(xiàng)。
總結(jié)
以上是生活随笔為你收集整理的git 历史操作日志_Git - 查看提交历史的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python学习笔记:异步IO(2)
- 下一篇: win7设置计算机临时用户,Win7小技