@
在提交了若干更新,又或者
clone
了某個專案之後,你也許想回顧下提交歷史。 完成這個任務最簡單而又有效的工具是 git log
命令。
1、git clone
我們使用一個非常簡單的 “simplegit
” 專案作為示例:
位置:https://github.com/schacon/simplegit-progit
執行下面的命令獲取該專案:
git clone https://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
會將每個提交放在一行顯示,在瀏覽大量的提交時非常有用。 另外還有 short
,full
和 fuller
選項,它們展示資訊的格式基本一致,但是詳盡程度不一:
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 | 提交說明 |
作者指的是實際作出修改的人,提交者指的是最後將此工作成果提交到倉庫的人。 所以,當你為某個專案釋出補丁,然後某個核心成員將你的補丁併入專案時,你就是作者,而那個核心成員就是提交者。
當 oneline
或 format
與另一個 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 原始碼庫:https://github.com/git/git
clone: git clone https://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 選項。