-
1. 起步
-
2. Git 基礎
-
3. Git 分支
-
4. 伺服器上的 Git
- 4.1 協議
- 4.2 在伺服器上部署 Git
- 4.3 生成 SSH 公鑰
- 4.4 架設伺服器
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方託管服務
- 4.10 小結
-
5. 分散式 Git
-
A1. 附錄 A: Git 在其他環境
- A1.1 圖形介面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 小結
-
A2. 附錄 B: 在應用程式中嵌入 Git
-
A3. 附錄 C: Git 命令
2.3 Git基礎 - 檢視提交歷史
檢視提交歷史
在建立了若干提交後,或者如果你克隆了一個帶有現有提交歷史的倉庫,你可能會想回顧一下都發生了什麼。最基本也是最強大的工具是 git log 命令。
這些示例使用一個非常簡單的專案,名為“simplegit”。要獲取該專案,請執行
$ git clone https://github.com/schacon/simplegit-progit
當你在該專案中執行 git log 時,你應該會看到類似以下的輸出
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
Remove unnecessary test
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
Initial commit
預設情況下,不帶任何引數的 git log 會以逆 chronological 順序列出倉庫中的提交;也就是說,最近的提交會先顯示。正如你所看到的,這個命令列出了每個提交的 SHA-1 校驗和、作者姓名和電子郵件、編寫日期以及提交訊息。
git log 命令提供了大量各種各樣的選項,可以幫助你精確地找到你想要的資訊。在這裡,我們將展示一些最受歡迎的選項。
最有用的選項之一是 -p 或 --patch,它會顯示每個提交引入的差異(補丁輸出)。你還可以限制顯示的日誌條目數量,例如使用 -2 只顯示最後兩條條目。
$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change 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
Remove 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
這個選項會顯示相同的資訊,但每個條目後面都直接跟著一個 diff。這對於程式碼審查或快速瀏覽協作者新增的一系列提交發生了什麼非常有幫助。你還可以使用一系列總結選項與 git log 一起使用。例如,如果你想檢視每個提交的一些摘要統計資訊,可以使用 --stat 選項
$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change 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
Remove 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
Initial commit
README | 6 ++++++
Rakefile | 23 +++++++++++++++++++++++
lib/simplegit.rb | 25 +++++++++++++++++++++++++
3 files changed, 54 insertions(+)
正如你所看到的,--stat 選項會在每個提交條目下方列印一個修改過的檔案列表,顯示有多少檔案被更改,以及在這些檔案中新增和刪除了多少行。它還在最後放置了資訊的摘要。
另一個非常實用的選項是 --pretty。這個選項會將日誌輸出更改為預設以外的其他格式。為你提供了一些預設的選項值。該選項的 oneline 值會將每個提交列印在單行上,這對於檢視大量提交很有用。此外,short、full 和 fuller 值分別以大致相同的格式顯示輸出,但包含的資訊量更少或更多。
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 Change version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Remove unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 Initial commit
最有趣的選項值是 format,它允許你指定自己的日誌輸出格式。這在生成供機器解析的輸出時特別有用——因為你明確指定了格式,所以你知道它不會隨著 Git 的更新而改變。
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : Change version number
085bb3b - Scott Chacon, 6 years ago : Remove unnecessary test
a11bef0 - Scott Chacon, 6 years ago : Initial commit
git log --pretty=format 的有用說明符 列出了一些 format 可以接受的更實用的說明符。
| 說明符 | 輸出說明 |
|---|---|
|
提交雜湊 |
|
縮寫的提交雜湊 |
|
樹雜湊 |
|
縮寫的樹雜湊 |
|
父提交雜湊 |
|
縮寫的父提交雜湊 |
|
作者姓名 |
|
作者電子郵件 |
|
作者日期(格式遵守 |
|
作者日期,相對 |
|
提交者姓名 |
|
提交者電子郵件 |
|
提交者日期 |
|
提交者日期,相對 |
|
主題 |
你可能想知道 *作者* 和 *提交者* 之間的區別。作者是最初創作作品的人,而提交者是最後應用該作品的人。所以,如果你向一個專案傳送一個補丁,而核心成員之一應用了該補丁,你們倆都會獲得認可——你作為作者,核心成員作為提交者。我們將在 分散式 Git 中更詳細地介紹這種區別。
oneline 和 format 選項值與另一個名為 --graph 的 log 選項特別有用。這個選項會新增一個漂亮的 ASCII 圖,顯示你的分支和合並歷史。
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 Ignore errors from SIGCHLD on trap
* 5e3ee11 Merge branch 'master' of https://github.com/dustin/grit.git
|\
| * 420eac9 Add 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 的常用選項 列出了我們到目前為止介紹的選項,以及一些其他可能有用的常見格式化選項,以及它們如何改變 log 命令的輸出。
| 選項 | 說明 |
|---|---|
|
顯示每個提交引入的補丁。 |
|
顯示每個提交中修改過的檔案的統計資訊。 |
|
僅顯示 |
|
在提交資訊後顯示修改過的檔案列表。 |
|
顯示受影響的檔案列表,並附帶新增/修改/刪除資訊。 |
|
只顯示 SHA-1 校驗和的前幾個字元,而不是全部 40 個。 |
|
以相對格式(例如,“2 周前”)顯示日期,而不是使用完整日期格式。 |
|
在日誌輸出旁邊顯示分支和合並歷史的 ASCII 圖。 |
|
以其他格式顯示提交。選項值包括 |
|
|
限制日誌輸出
除了輸出格式化選項外,git log 還接受許多有用的限制選項;也就是說,允許你只顯示部分提交的選項。你已經看到過一個這樣的選項——-2 選項,它只顯示最後兩個提交。事實上,你可以使用 -<n>,其中 n 是任何整數,來顯示最後 n 個提交。實際上,你不太可能經常使用它,因為 Git 預設透過分頁器管道傳輸所有輸出,所以你一次只能看到一頁日誌輸出。
然而,像 --since 和 --until 這樣的時間限制選項非常有用。例如,這個命令會獲取過去兩週內進行的提交列表
$ git log --since=2.weeks
這個命令可以處理很多格式——你可以指定一個具體日期,如 "2008-01-15",或者一個相對日期,如 "2 years 1 day 3 minutes ago"。
你還可以過濾列表以查詢匹配某些搜尋條件的提交。 --author 選項允許你按特定作者進行過濾,而 --grep 選項則允許你在提交訊息中搜索關鍵字。
|
注意
|
你可以指定多個 |
另一個非常有用的過濾器是 -S 選項(俗稱 Git 的“pickaxe”選項),它接受一個字串,只顯示那些改變了該字串出現次數的提交。例如,如果你想找到最後一次新增或刪除對特定函式的引用的提交,你可以呼叫
$ git log -S function_name
傳遞給 git log 作為過濾器的最後一個有用的選項是路徑。如果你指定一個目錄或檔名,你可以將日誌輸出限制為引入了對這些檔案更改的提交。這始終是最後一個選項,並且通常前面帶有雙破折號(--)來將路徑與選項分開。
$ git log -- path/to/file
在 限制 git log 輸出的選項 中,我們將列出這些以及其他一些常見的選項供你參考。
| 選項 | 說明 |
|---|---|
|
只顯示最後 n 個提交。 |
|
將提交限制在指定日期之後進行的提交。 |
|
將提交限制在指定日期之前進行的提交。 |
|
只顯示作者條目匹配指定字串的提交。 |
|
只顯示提交者條目匹配指定字串的提交。 |
|
只顯示提交訊息包含指定字串的提交。 |
|
只顯示新增或刪除與指定字串匹配的程式碼的提交。 |
例如,如果你想檢視 Git 原始碼歷史中修改了測試檔案的提交,這些提交由 Junio Hamano 在 2008 年 10 月提交,並且不是合併提交,你可以執行如下命令:
$ 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
在 Git 原始碼歷史近 40,000 次提交中,這個命令顯示了 6 次符合這些條件的提交。
|
提示
|
阻止顯示合併提交
取決於你倉庫中使用的工作流程,你的日誌歷史中可能相當一部分提交只是合併提交,而這些提交通常資訊量不大。為了防止合併提交充斥你的日誌歷史,只需新增 |