Git學習教程(六)Git日誌

第六課 Git 日誌

內容提要:瀏覽項目歷史,查詢指定提交內容,圖形化顯示分枝和合並...

'git log'是git中最常用的一個命令,執行之後,會顯示該項目的提交歷史。如果命令不加任何參數,那麼就會顯示目前所在分枝上,從最後一次提交開始,按時間順序依次向前排列的所有提交歷史記錄。
$ git log
commit 166ae0c4d3f420721acbb115cc33848dfcc2121a
Author: Scott Chacon <
[email protected]>
Date:   Sun Feb 8 16:50:43 2009 -0800
    started write support
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <
[email protected]>
Date:   Sun Apr 27 20:43:35 2008 -0700
    updated rakefile
commit 964f16d36dfccde844893cac5b347e7b3d44abbc
Author: Magnus Chacon <
[email protected]>
Date:   Sun Apr 27 20:34:23 2008 -0700
    commit the todo
上面顯示了3次提交,對於每一次的提交都會顯示四方面內容,分別是:
*提交的校驗和
*作者信息(作者名和email地址)
*提交日期
*提交信息
 
這是git日誌默認輸出的提交歷史的內容格式。多數情況下,這樣輸出還是比較完美的。然而,有時候你只是想看到某個分枝上的最後幾條提交信息,或者某些感興趣的數據,只要在'git log'命令後面加上相應的參數,它就可以做更多有意義的事情。
日誌輸出格式
通過'git log'命令還能有很多種可選的輸出格式。
 
顯示補丁
 
你可以查看每一次提交條目的補丁內容,只需要在'git log'後加上-p選項,這在代碼複查時很管用--在合併到你的某個分枝之前查看是其他作者提交了什麼內容,或者是看看在最後發佈之前所做的修改。
$ git log -p
commit 0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc
Author: Scott Chacon <
[email protected]>
Date:   Sun Feb 8 18:29:31 2009 -0800
    added a commit function
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index dd6b7b3..c75a3e6 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -9,6 +9,10 @@ class SimpleGit
     command("git status")
   end
+  def commit(message)
+    command("git commit -m '#{message}'")
+  end
+
   def show(treeish = 'master')
     command("git show #{treeish}")
   end
commit 166ae0c4d3f420721acbb115cc33848dfcc2121a
Author: Scott Chacon <
[email protected]>
Date:   Sun Feb 8 16:50:43 2009 -0800
    started write support
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index dd6b7b3..e7dfaa9 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -9,6 +9,10 @@ class SimpleGit
     command("git status")
   end
+  def add(path)
+    command("git add #{path}")
+  end
+
   def show(treeish = 'master')
     command("git show #{treeish}")
   end
內容相當的冗長,但是這些輸出都是分頁的,所以一旦你得到了你需要的信息,後面的提交內容就可以都跳過了。
 
查看統計數字
你可以通過執行'git log -stat'命令,來顯示被修改文件的修改統計信息,添加或刪除了多少行。
$ git log --stat
commit 0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc
Author: Scott Chacon <
[email protected]>
Date:   Sun Feb 8 18:29:31 2009 -0800
    added a commit function
 lib/simplegit.rb |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)
commit 166ae0c4d3f420721acbb115cc33848dfcc2121a
Author: Scott Chacon <
[email protected]>
Date:   Sun Feb 8 16:50:43 2009 -0800
    started write support
 lib/simplegit.rb |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)
 
調整顯示格式
 
使用'git log --pretty=format'命令,可以將提交歷史顯示成你想要的格式。這裏format的可選項包括:oneline,short,medium,full,fuller,email,raw。每種格式都有側重的顯示相關內容。
$ git log --pretty=raw
commit 0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc
tree dbcff814ec9fbbd3487171a7eaca73cf0069ba53
parent 85211d1138cb91f25c0633d361ff5f6e00677bc5
author Scott Chacon <
[email protected]> 1234146571 -0800
committer Scott Chacon <
[email protected]> 1234146571 -0800
    added a commit function
commit 166ae0c4d3f420721acbb115cc33848dfcc2121a
tree e67636948570e27a9c2bf2699ecafadf729c3efc
parent 9fceb02d0ae598e95dc970b74767f19372d61af8
author Scott Chacon <
[email protected]> 1234140643 -0800
committer Scott Chacon <
[email protected]> 1234140643 -0800
    started write support
這裏,最常用的一種格式是'oneline', 每一行表示一次提交,一行內容包括校驗和與提交信息兩項內容。這種顯示格式可以很簡潔的顯示大量的提交信息。
$ git log --pretty=oneline
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
a5f4a0daa9b13bb85283461ddaba6e589e34ccb5 added cat-file
 
自定義格式
如果你希望git輸出自定義的提交信息,你可以使用這樣的命令:git log --pretty=format:"(format)".可以在""內自定義字符串與Git變量相結合的顯示格式,在輸出時,git會自動的將變量的位置輸出爲所需內容。
$ git log --pretty=format:"The author of %h was %an, %ar%nThe title was >>%s<<%n"
The author of 0b7434d was Scott Chacon, 18 hours ago
The title was >>added a commit function<<
The author of 166ae0c was Scott Chacon, 20 hours ago
The title was >>started write support<<
The author of 9fceb02 was Magnus Chacon, 10 months ago
The title was >>updated rakefile<<
The author of 964f16d was Magnus Chacon, 10 months ago
The title was >>commit the todo<<
The author of 8a5cbc4 was Scott Chacon, 5 months ago
The title was >>updated readme<<
更多詳細自定義格式方法可以參考 git log docs
分枝拓撲圖
 
還有一個日誌輸出選項是-graph,這個選項與--pretty=oneline結合不僅可以顯示提交歷史而且還會顯示圖形化的分枝拓撲
$ git log --pretty=oneline --graph
*   15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
|\ 
| * a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
* |   4a447f750f910445e38338aadef48f3038b35d2b sweet
|\ \ 
| |/ 
| * 0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
* |   6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
|\ \ 
| |/ 
| * 4682c3261057305bdd616e23b64b0857d832627b added a todo file
| * ebe0d698d3def0ec43f9b883857717de8c405d96 removed the todo file
| * 166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
* | 0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
* | 85211d1138cb91f25c0633d361ff5f6e00677bc5 removed todo file
|/ 
* 9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
提交查詢過濾器

利用提交查詢過濾器可以查詢經過某些條件限制後得到的提交信息。
日期區間
'git log'命令後如果跟-before和-after選項,就會顯示兩個日期之間的提交條目。日期格式也有不同的可選格式。例如,我想查看1月26號之後,2個星期之前的提交內容,可以運行:
$ git log --before="2 weeks ago" --after="2009-01-26" --pretty=oneline
dfb047b9e4f7f66c5322ef642f21fd92b0a975e3 Mention "local convention" rule in t
25655221745fd27d5da3bda7ad0fe49f2005d776 Windows: Revert to default paths and
35fb0e8633217f602360a9987af51c4b960e7850 Compute prefix at runtime if RUNTIME
8e3462837b0ace04357503a3f58802cc2231df29 Modify setup_path() to only add git_
2fb3f6db96492b680899f9e40f434eeb4c778a84 Add calls to git_extract_argv0_path(
2cd72b0b290e40fb4d6a925ce26603503f01aa09 git_extract_argv0_path(): Move check
4dd47c3b867f51211d0dc4474dab0fee5ca614da Refactor git_set_argv0_path() to git
026fa0d5ad9538ca76838070861531c037d7b9ba Move computation of absolute paths f
 
貢獻者過濾器
 
git還可以通過貢獻者過濾器來查看某個作者發起的提交。在commit對象中實際上存在兩個人的記錄--一個是作者(author),也就是做原始提交的人。第二個人名是提交者(committer),就是提交到倉庫中的人。在這裏找不到合適的翻譯,所以把二者統稱爲貢獻者。一般情況下,所指的都是同一個人,但是在某些情況下就不是了--譬如,有一個作者將他寫的東西email給項目持有人,這個項目持有人就是提交者(committer),項目持有人將作者提交的東西提交到git倉庫中。
 
大多數情況搜索的是作者,當然你可以通過-author或者-committer加名字的方式來搜索相應的提交條目。下面這個例子我們是執行命令來查找作者名(author)爲Johannes Schindelin,在過去兩週內的所有提交條目:
$ git log --author=johannes.schindelin --since="14 days ago" --pretty=oneline
26be15f09db15d2b53a13d0f184d77fb54367f33 filter-branch: do not consider diver
e1e4389832f32bb6ce029d6a6b110aa9ec768ea8 apply: fix access to an uninitialize
418566b6fdcc0eb1b5549d0742366aa13a7ff277 Fix 'git diff --no-index' with a non
f7951e1d97aeb7b3ed359faeab5edf9e870ec8a5 Simplify t3412
37e5c8f46042510176a71d73c903c44214e09815 Simplify t3411
4bd03d15e495086a38470b59447296db4c235cb9 Simplify t3410
008849689e04e774aa7b194cd690405761e2383a test-lib.sh: introduce test_commit()
03af0870a0e6d551a31eb830d5c2682b82ae0ac6 lib-rebase.sh: Document what set_fak
29a03348a336f28025c824436a713cb9cb01b7a6 t3404 & t3411: undo copy&paste
b8469ad0578d6b84ec92752a5f8df3ca5828af77 test-path-utils: Fix off by one, fou
f265458f6116a0c03200477ae3b839f2a75bf0fa get_sha1_basic(): fix invalid memory

你可以指定完整人名或email地址來搜索,你也可以使用這些值的部分內容來查詢,譬如,搜索Junio Hamano作者的提交內容,可以執行下面的任意一條語句:
我們甚至還可以通過'gmail.com'來搜索,結果就是email主機地址爲gmail.com的貢獻者所作提交的內容。
$ git log --author=gmail --pretty=format:"%ae" | wc -l
 1348
$ git log --author=gmail --pretty=format:"%ae" | sort -u | wc -l
     113
從這兩個命令執行之後的結果看到,Git源碼項目有113個gmail賬戶的作者貢獻的1348個補丁。有趣的是,沒有一個作者使用hotmail賬戶,但是有81個補丁來自'.mil'(都出自一個人)。
$ git log --author='\.mil' --pretty=format:"%ae" | wc -l
      81

查找提交信息

如果你對“提交信息”更感興趣,你可以通過提交信息裏面的某個字符串來查找相應的提交。例如,下面是搜索在提交信息中含有'c90'的所有提交內容。
$ git log --grep='C90' --pretty=oneline
8c9e7947c2a76fb21bda11816c544d50e271156d http-push.c: squelch C90 warnings.

 
文件歷史
還有的時候,你希望查看某個指定文件的提交歷史。譬如你希望查看'notes.c'文件每一次的提交歷史,你可以運行:
$ git log --pretty=oneline -- notes.c
22a3d060937072b0f197a8084af879c753c68fe7 git-notes: fix printing of multi-lin
2dd625d022074bb677bdd5caa5146cabaf726123 Speed up git notes lookup
879ef2485d6ced20845ca626ecb45a9b65aa3a70 Introduce commit notes

你還可以對文件目錄進行這樣的操作,譬如你想查看't/lib-httpd'目錄的提交歷史:
$ git log --pretty=oneline --all -- t/lib-httpd/
466ddf90c2f270b973d141f20e912f743743331c http-push: when making directories,
603fb1168218a813f1b0816b1208c5d0c92cf29d Avoid apache complaining about lack
faa4bc35a05ddb1822f3770cd8c51859e3b929ee http-push: add regression tests

 
也可以加入多個查詢項目,譬如要查看't/lib-httpd'目錄或notes.c文件的提交歷史:
$ git log --pretty=oneline -- t/lib-httpd/ notes.c
7b75b331f6744fbf953fe8913703378ef86a2189 Merge branch 'js/notes'
466ddf90c2f270b973d141f20e912f743743331c http-push: when making directories,
22a3d060937072b0f197a8084af879c753c68fe7 git-notes: fix printing of multi-lin
2dd625d022074bb677bdd5caa5146cabaf726123 Speed up git notes lookup
879ef2485d6ced20845ca626ecb45a9b65aa3a70 Introduce commit notes
603fb1168218a813f1b0816b1208c5d0c92cf29d Avoid apache complaining about lack
faa4bc35a05ddb1822f3770cd8c51859e3b929ee http-push: add regression tests

 
其他選項
很多時候想查看未合併的提交歷史記錄,所以你可以加上'--no-merges'選項
$ git log --grep='C90' --pretty=oneline --no-merges
8c9e7947c2a76fb21bda11816c544d50e271156d http-push.c: squelch C90 warnings.
8f1d2e6f49ee51ac062ab38337a6a70dd1998def [PATCH] Compilation: zero-length arr
01c6ad29bd1b647d4fd1acea54e374c740ec3c10 [PATCH] Fix strange timezone handlin

還可以在查看日誌命令最後加上-N來查看滿足條件的最近的N條歷史記錄:
$ git log --pretty=oneline --no-merges -5
621f1b4bcf40f1469fc59202248df35619e33c82 GIT 1.6.2-rc0
7851386948dce72c739bcdfe08f069afe4f5ea45 emacs: Remove the no longer maintain
5a7b3bf5275adf86fdd23f8824562b88c8a20e33 git.el: Add some notes about Emacs v
6c4f70d5b2fb8f9275ca85e0927f00b8bc892819 git.el: Use integer instead of chara
efd49f50fc087df2ad46f194ca848c5335f4cca9 git.el: Set a regexp for paragraph-s

 
如果下面是我們的提交歷史:
$ git log --pretty=oneline --graph
* 9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
* 964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
* 8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
* a5f4a0daa9b13bb85283461ddaba6e589e34ccb5 added cat-file
* 310154e3c7db47d8bac935c2c43aee6afac11aae updated README formatting and adde
* f7f3f6dd8fd3fa40f052427c32785a0fa01aaa5f changed my name a bit
* 710f0f8d2cdf5af87033b9ec08859a505f9a6af5 added ls-files
* c110d7ff8cfb86fd5cce9a8aee462678dbb4ef9b made the ls-tree function recursiv
* ce9b0d5551762048735dd67917046b44176317e0 limiting log to 30
我們希望只看到提交信息爲'added Is-files'之後,'updated readme'之前的提交歷史,我們可以這樣指定查詢:
[master]$ git log --pretty=oneline 710f0f..8a5cbc
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
a5f4a0daa9b13bb85283461ddaba6e589e34ccb5 added cat-file
310154e3c7db47d8bac935c2c43aee6afac11aae updated README formatting and added
f7f3f6dd8fd3fa40f052427c32785a0fa01aaa5f changed my name a bit

如果你在查找一個分枝上的提交時,這樣做非常管用。譬如,你目前在'master'分枝上,並且想查看'experiment'分枝上還沒有合併的提交記錄的話,可以這樣:
$ git log master..experiment --pretty=oneline
f6b98e46bdf64454d7c6ab76d617237118799d7b git-web--browse: Fix check for /bin/
df487baa30924a36ade38ada4f77379236dcce0f Merge branch 'maint'
a9ee90d7ff9f3854b3096b4abbdc2013708704f5 completion: Get rid of tabbed indent
cf9957875c3a27b6ae4593e1fa9d4dabbde68433 completion: Fix GIT_PS1_SHOWDIRTYSTA
7e1100e9e939c9178b2aa3969349e9e8d34488bf gitweb: add $prevent_xss option to p

這就告訴你,如果現在合併的話,那麼所有列出的這些提交都會被合併。你也可以不寫某一端的分枝名,git會判斷你目前正在哪個分枝上,所以,如果你在master分枝上的話,下面的命令執行結果和上面的一樣:
$ git log ..experiment --pretty=oneline

如果你在experiment分枝上,也想看到相同的信息,即還沒有合併到master的提交,可以運行:
$ git log master.. --pretty=oneline
 
這一節講的都是很常用的命令,下一課將深入剖析這些內容,但是這一節課最關鍵的是記住這些命令和它的作用。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章