Git(7)– 查看提交歷史(git log 命令詳解)

@

在提交了若干更新,又或者clone了某個項目之後,你也許想回顧下提交歷史。 完成這個任務最簡單而又有效的工具是 git log 命令。

1、git clone

我們使用一個非常簡單的 「simplegit」 項目作為示例:

位置://github.com/schacon/simplegit-progit
在這裡插入圖片描述
運行下面的命令獲取該項目:

git clone //github.com/schacon/simplegit-progit
在這裡插入圖片描述

2、git log

當你在此項目中運行 git log 命令時,可以看到下面的輸出:
在這裡插入圖片描述

Git(4)– 如何退出 git log 和 git commit 狀態

不傳入任何參數的默認情況下,git log 會按時間先後順序列出所有的提交,最近的更新排在最上面。 正如你所看到的,這個命令會列出每個提交的 SHA-1 校驗和、作者的名字和電子郵件地址、提交時間以及提交說明。

git log 有許多選項可以幫助你搜尋你所要找的提交, 下面我們會介紹幾個最常用的選項。

3、git log -p

其中一個比較有用的選項是 -p--patch ,它會顯示每次提交所引入的差異(按 修補程式 的格式輸出)。 你也可以限制顯示的日誌條目數量,例如使用 -2 選項來只顯示最近的兩次提交:
在這裡插入圖片描述

該選項除了顯示基本資訊之外,還附帶了每次提交的變化。 當進行程式碼審查,或者快速瀏覽某個搭檔的提交所帶來的變化的時候,這個參數就非常有用了。 你也可以為 git log 附帶一系列的總結性選項。 比如你想看到每次提交的簡略統計資訊,可以使用 --stat 選項:

4、git log --stat

在這裡插入圖片描述
正如你所看到的,--stat 選項在每次提交的下面列出所有被修改過的文件、有多少文件被修改了以及被修改過的文件的哪些行被移除或是添加了。 在每次提交的最後還有一個總結。

5、git log --pretty=oneline

另一個非常有用的選項是 --pretty。 這個選項可以使用不同於默認格式的方式展示提交歷史。 這個選項有一些內建的子選項供你使用。 比如 oneline 會將每個提交放在一行顯示,在瀏覽大量的提交時非常有用。 另外還有 shortfullfuller 選項,它們展示資訊的格式基本一致,但是詳盡程度不一:
在這裡插入圖片描述

6、git log --pretty=short

在這裡插入圖片描述

7、git log --pretty=full

在這裡插入圖片描述

8、git log --pretty=fuller

在這裡插入圖片描述

9、訂製記錄的顯示格式:git log --pretty=format

最有意思的是 format ,可以訂製記錄的顯示格式。 這樣的輸出對後期提取分析格外有用——因為你知道輸出的格式不會隨著 Git 的更新而發生改變:

在這裡插入圖片描述
git log --pretty=format 常用的選項 列出了 format 接受的常用格式佔位符的寫法及其代表的意義。

git log --pretty=format 常用的選項

選項 說明
%H 提交的完整哈希值
%h 提交的簡寫哈希值
%T 樹的完整哈希值
%t 樹的簡寫哈希值
%P 父提交的完整哈希值
%p 父提交的簡寫哈希值
%an 作者名字
%ae 作者的電子郵件地址
%ad 作者修訂日期(可以用 –date=選項 來訂製格式)
%ar 作者修訂日期,按多久以前的方式顯示
%cn 提交者的名字
%ce 提交者的電子郵件地址
%cd 提交日期
%cr 提交日期(距今多長時間)
%s 提交說明

作者指的是實際作出修改的人,提交者指的是最後將此工作成果提交到倉庫的人。 所以,當你為某個項目發布修補程式,然後某個核心成員將你的修補程式併入項目時,你就是作者,而那個核心成員就是提交者。

onelineformat 與另一個 log 選項 --graph 結合使用時尤其有用。 這個選項添加了一些 ASCII 字元串來形象地展示你的分支、合併歷史:

在這裡插入圖片描述

在git源碼庫中使用此命令,項目太多了,截圖兩張了解下:
首頁:
在這裡插入圖片描述
某一頁:
在這裡插入圖片描述
以上只是簡單介紹了一些 git log 命令支援的選項。 git log 的常用選項 列出了我們目前涉及到的和沒涉及到的選項,以及它們是如何影響 log 命令的輸出的。

git log 的常用選項

選項 說明
-p 按修補程式格式顯示每個提交引入的差異。
–stat 顯示每次提交的文件修改統計資訊。
–shortstat 只顯示 –stat 中最後的行數修改添加移除統計。
–name-only 僅在提交資訊後顯示已修改的文件清單。
–name-status 顯示新增、修改、刪除的文件清單。
–abbrev-commit 僅顯示 SHA-1 校驗和所有 40 個字元中的前幾個字元。
–relative-date 使用較短的相對時間而不是完整格式顯示日期(比如「2 weeks ago」)。
–graph 在日誌旁以 ASCII 圖形顯示分支與合併歷史。
–pretty 使用其他格式顯示歷史提交資訊。可用的選項包括 oneline、short、full、fuller 和 format(用來定義自己的格式)。
–oneline –pretty=oneline –abbrev-commit 合用的簡寫。

10、git log --oneline

在這裡插入圖片描述
在這裡插入圖片描述

11、限制輸出長度

除了訂製輸出格式的選項之外,git log 還有許多非常實用的限制輸出長度的選項,也就是只輸出一部分的提交。 之前你已經看到過 -2 選項了,它只會顯示最近的兩條提交, 實際上,你可以使用類似 -<n> 的選項,其中的 n 可以是任何整數,表示僅顯示最近的 n 條提交。 不過實踐中這個選項不是很常用,因為 Git 默認會將所有的輸出傳送到分頁程式中,所以你一次只會看到一頁的內容。

但是,類似 --since--until 這種按照時間作限制的選項很有用。 例如,下面的命令會列出最近兩周的所有提交:git log --since=2.weeks

最近14年的所有提交:

git log --since=14.years

在這裡插入圖片描述
該命令可用的格式十分豐富——可以是類似 “2008-01-15” 的具體的某一天,也可以是類似 “14 years 1 day 3 minutes ago” 的相對日期。

git log --since=14 years 1 day 3 minutes ago

在這裡插入圖片描述

git log --since="2008-01-15"

在這裡插入圖片描述
還可以過濾出匹配指定條件的提交。 用 --author 選項顯示指定作者的提交,用 --grep 選項搜索提交說明中的關鍵字。

你可以指定多個 –author 和 –grep 搜索條件,這樣會只輸出 任意 匹配 –author 模式和 –grep 模式的提交。然而,如果你添加了 –all-match 選項, 則只會輸出 所有 匹配 –grep 模式的提交。

另一個非常有用的過濾器是 -S, 它接受一個字元串參數,並且只會顯示那些添加或刪除了該字元串的提交。 假設你想找出添加或刪除了對某一個特定函數的引用的提交,可以調用:

git log -S function_name

最後一個很實用的 git log 選項是路徑(path), 如果只關心某些文件或者目錄的歷史提交,可以在 git log 選項的最後指定它們的路徑。 因為是放在最後位置上的選項,所以用兩個短劃線(--)隔開之前的選項和後面限定的路徑名。

限制 git log 輸出的選項 中列出了常用的選項。

限制 git log 輸出的選項

選項 說明
-<n> 僅顯示最近的 n 條提交。
–since, –after 僅顯示指定時間之後的提交。
–until, –before 僅顯示指定時間之前的提交。
–author 僅顯示作者匹配指定字元串的提交。
–committer 僅顯示提交者匹配指定字元串的提交。
–grep 僅顯示提交說明中包含指定字元串的提交。
-S 僅顯示添加或刪除內容匹配指定字元串的提交。

12、實例:

來看一個實際的例子,如果要在 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/

Git 源碼庫://github.com/git/git
在這裡插入圖片描述

clone: git clone //github.com/git/git.git
在這裡插入圖片描述
命令:

git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" --before="2008-11-01" --no-merges -- t/

在這裡插入圖片描述
在近 40000 條提交中,上面的輸出僅列出了符合條件的 6 條記錄。

隱藏合併提交: 按照你程式碼倉庫的工作流程,記錄中可能有為數不少的合併提交,它們所包含的資訊通常並不多。為了避免顯示的合併提交弄亂歷史記錄,可以為 log 加上 –no-merges 選項。

在這裡插入圖片描述