『現學現忘』Git基礎 — 25、git log命令引數詳解

繁華似錦Fighting發表於2022-05-11

git log命令主要用於檢視Git版本演變歷史(也就是提交歷史),同時根據追加的引數和選項不同,也會有不同的展示效果。

但預設git log命令顯示出的x效果實在太醜,不好好打扮一下根本沒法見人,打扮好了用alias命令拍個照片,就正式出道了!

1、git log命令說明

git log用於查詢版本的歷史,命令形式如下:

git log [<options>] [<since>..<until>] [[--] <path>...]

預設的git log命令顯示效果如下:

image

(之前檔案詳細說明過了,這裡簡單說一下,主要說明git log命令的引數)

2、git log命令引數

這條命令有很多引數選項,下面詳細的說明:

(1)不帶引數

  1. 如果不帶任何引數,它會列出所有歷史記錄,最近的排在最上方,顯示提交物件的雜湊值,作者、提交日期、和提交說明。
  2. 如果記錄過多,則按上下鍵Enter(向下顯示一行),空格(顯示下一頁),來控制顯示。
  3. q鍵退出歷史記錄列表。

(2)常用顯示引數

  1. -p:按補丁格式顯示每個更新的差異,比下一條--stat命令資訊更全。
  2. --stat:顯示每次提交修改檔案的統計資訊,每個提交都列出了修改過的檔案,以及其中新增和移除的行數,並在最後列出所有增減行數小計。
  3. --shortstat:只顯示--stat中最後的行數新增、修改、刪除的統計。
  4. --name-only:僅在提交資訊後,顯示已修改的檔案清單。
  5. --name-status:顯示新增、修改、刪除的檔案清單。
  6. --abbrev-commit:僅顯示SHA-1校驗和的前幾個字元,而非所有的40個字元。
  7. --relative-date:使用較短的相對時間,而不是完整格式顯示日期(比如“2 weeks ago”)。
  8. --graph:在日誌旁以ASCII圖形顯示分支與合併歷史。
  9. --online:列表的形式檢視歷史版本記錄,--pretty=oneline --abbrev-commit 合用的簡寫。
  10. --pretty:使用其他格式顯示歷史提交資訊。可用的選項包括onelineshortfullfullerformat(用來定義自己的格式)。

(3)--pretty引數

--pretty:自定義格式化顯示歷史提交資訊。

選項有:

1)--pretty=oneline:一行顯示,只顯示雜湊值和提交說明(--online本身也可以作為單獨的屬性)。

2)--pretty=format:” ":控制顯示資訊的格式。

序號 格式 說明
1 %H 提交的完整雜湊值(commit-id)。
2 %h 提交的簡寫雜湊值。
3 %T 樹的完整雜湊值(tree)。
4 %t 樹的簡寫雜湊值。
5 %P 父提交(parent)的完整雜湊值。
6 %p 父提交的簡寫雜湊值。
7 %an 作者名字(author)。
8 %ae 作者的電子郵件地址。
9 %ad 作者修訂日期(可以用 --date=選項 來定製格式)。
10 %ar 作者修訂日期,按多久以前的方式顯示。
11 %cn 提交者的名字(committer)。
12 %ce 提交者的電子郵件地址。
13 %cd 提交日期(可以用 --date=選項 來定製格式)。
14 %cr 提交日期,按多久以前的方式顯示。
15 %s 提交說明。

3)--pretty=format:” ":控制顯示資訊的顏色。

  1. 顏色格式:
    %Cred:將顏色切換為紅色。
    %Cgreen:將顏色切換為綠色。
    %Cblue:將顏色切換為藍色。
    %Creset:空格。
  2. 舉例:
    執行命令:git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %C(cyan)%s %C(magenta)(%cr) %C(bold blue)<%an>%Creset'
    兩種效果如下:
    image
  3. 我們先進行斷句分析:[%Cred%h][%Creset -][%C(yellow)%d ][%Cblue%s][%Cgreen(%cd)][%C(bold blue)<%an>]
    然後就是很明顯能得到的規律了:
    • 寫法:一個顏色+一個內容,例如%Cred%h,依次排寫。
    • 顏色以%C開頭,後邊接幾種顏色,還可以設定字型,如果要設定字型的話,要一塊加個括號。
      能設定的顏色值包括:reset(預設的灰色),normalblackredgreenyellowbluemagentacyanwhite。(不能單獨使用就加括號)
      字型屬性則有bolddimulblinkreverse
    • 內容可以是佔位元字元,也可以是直接顯示的普通字元(例如上面的-)。

(4)--date=引數

--date=(relative|local|default|iso|rfc|short|raw)

僅對以人類可讀格式顯示的日期生效,例如使用--pretty.log.date這個config變數設定日誌的預設值。

--date有幾個預設選項:

  1. --date=relative:顯示相對於當前時間的日期,例如"2小時前"。
  2. --date=local:顯示使用者本地時區中的時間戳。
  3. --date=iso--date=iso8601:以ISO 8601格式顯示時間戳。
  4. --date=rfc--date=rfc2822:以RFC 2822格式顯示時間戳,通常在電子郵件中找到。
  5. --date=short:僅以YYYY-MM-DD格式顯示日期,而不顯示時間。
  6. --date=raw:以內部原始Git格式%s %z格式顯示日期。
  7. --date=default:顯示原始時區(提交者或作者)的時間戳。

也可以自定義格式(需要Git版本2.6.0以上)

比如:--date=format:'%Y-%m-%d %H:%M:%S',會格式化成:2016-01-13 11:32:13

其他的格式化佔位符如下:

  1. %a:星期的縮寫。
  2. %A:星期的全名。
  3. %b:月份的縮寫。
  4. %B:月份的全稱。
  5. %c:適用於區域設定的日期和時間表示。
  6. %d:月中的天作為十進位制數字(01 – 31)。
  7. %H: 24小時制的小時(00 – 23)。
  8. %I:2小時格式的小時(01 – 12)。
  9. %j:一年中的天作為十進位制數字(001 – 366)。
  10. %m:以十進位制數字表示的月份(01 – 12)。
  11. %M:分鐘以十進位制數字表示(00 – 59)。
  12. %p:當前語言環境的"上午/下午",12小時制的指示器。
  13. %S:秒作為十進位制數字(00 – 59)。
  14. %U:一年中的周為十進位制數字,週日為一週的第一天(00 – 53)。
  15. %w:工作日為十進位制數字(0 – 6;星期日為0)。
  16. %W:一年中的星期作為十進位制數字,星期一作為星期的第一天(00 – 53)
  17. %x:當前語言環境的日期表示。
  18. %X:當前語言環境的時間表示。
  19. %y:無世紀的年份,為十進位制數字(00 – 99),也就是年份沒有前兩位。
  20. %Y:帶世紀的年份,以十進位制數表示。
  21. %z%Z:時區名稱或時區縮寫,取決於登錄檔設定; 如果時區未知,則沒有字元。
  22. %%:表示百分號。

(5)篩選引數

1)按數量

  • -n:顯示前n條提交資訊。

2)按日期

  1. --after=
    比如git log --after="2014-7-1”,顯示2014年7月1號之後的commit(包含7月1號)。
    後邊的日期還可以用相對時間表示,比如"1 week ago"”yesterday",比如git log --after="yesterday"
  2. --before=:同上。

另外這兩條命令可以同時使用表示時間段,比如git log --after="2014-7-1" --before="2014-7-4"

同理:--since--until--after--before是一個意思。

--since, --after:僅顯示指定時間之後的提交。

--until, --before:僅顯示指定時間之前的提交。

3)按作者和提交者

--author=:僅顯示作者匹配指定字串的提交。

  1. 比如git log --author=“John",顯示John貢獻的commit
  2. 注意:作者名不需要精確匹配,只需要包含就行了。
  3. 而且可以使用正規表示式,比如git log --author="John|Mary”,搜尋MarryJohn貢獻的commit
  4. 而且這個--author不僅包含作者名,還包含作者的email,所以你可以用這個搜尋email

--committer:僅顯示提交者匹配指定字串的提交。

4)按commit描述

--grep=:僅顯示提交說明中包含指定字串的提交。

  1. 比如:git log --grep="JRA-224"
  2. 而且可以傳入-i用來忽略大小寫。
  3. 注意:如果想同時使用--grep--author,必須在附加一個--all-match引數。

5)按檔案

--(空格)檔案--[後邊沒有檔案]

  1. 有時你可能只對某個檔案的修改感興趣,或你只想檢視跟某個檔案相關的歷史資訊,你只需要插入你感興趣檔案的路徑,[對,是路徑,所以經常是不太好用]就可以了。
  2. 比如:git log -- foo.py bar.py ,只返回和foo.py檔案或bar.py檔案的相關commit
  3. 這裡的--是告訴Git,後面的引數是檔案路徑而不是branch(分支)的名字。 如果後面的檔案路徑不會和某個branch產生混淆,你可以省略--,比如git log foo.py
  4. 另外,後邊的路徑還支援正則,比如:git log *install.md ,是指定專案路徑下的所有以install.md結尾檔案的提交歷史。
  5. 另外,檔名應該放到引數的最後位置,通常在前面加上--並用空格隔開表示是檔案。
  6. 另外,git log file/,可以檢視file資料夾下所有檔案的提交記錄。

6)按分支

--

  1. --branchName branchName引數:為任意一個分支名字,檢視某個分支上的提交記錄。
  2. 需要放到引數中的最後位置處。
  3. 如果分支名與檔名相同,系統會提示錯誤,可通過--選項,來指定給定的引數,是分支名還是檔名。
    比如:在當前分支中有一個名為v1的檔案,同時還存在一個名為v1的分支。如下:
    git log v1 --,此時的v1代表的是分支名字(--後邊是空的)。
    git log -- v1,此時的v1代表的是名為v1的檔案。
    git log v1 -- v1:代表v1分支下的v1檔案。

7)按內容

-S"<string>"-G"<string>":僅顯示新增或刪除內容匹配指定字串的提交。

  1. 有時你想搜尋,新增或刪除某行程式碼相關的commit. 可以使用這條命令。
  2. 假設你想知道Hello,World!這句話,是什麼時候加入到專案裡去的,可以用:git log -S"Hello,World!"
  3. 另外,如果你想使用正規表示式去匹配,而不是字串,那麼你可以使用-G代替-S
  4. 這是一個非常有用的debug工具,使用他可以定位所有跟某行程式碼相關的commit,甚至可以檢視某行是什麼時候被copy的,什麼時候移到另外一個檔案中去的。
  5. 注意:-S後沒有"=",與查詢內容之間也沒有空格符。

8)按範圍

git log <since>..<until>

  1. 這個命令可以檢視某個範圍的commit
  2. 這個命令非常有用當你使用branch做為range引數的時候. 能很方便的顯示2個branch(分支)之間的不同。
  3. 比如:git log master..featuremaster..feature這個range(範圍),包含了在feature分支存在,而在master分支沒有的所有commit。同樣,如果是feature..master,意思是包含所有master分支有,但是feature分支沒有的commit
  4. 另外,如果是三個點,表示或的意思:git log master...test,意思是查詢mastertest分支中的提交記錄。

9)過濾掉merge commit

--no-merges

  1. 預設情況下git log會輸出merge commit(合併提交)。你可以通過--no-merges標記來過濾掉merge commit,例如:git log --no-merges
  2. 另外,如果你只對merge commit感興趣可以使用--merges引數,例如:git log --merges

10)按標籤tag

git log v1.0

  1. 直接這樣是查詢標籤之前的commit
  2. 加兩個點,例如:git log v1.0.. ,是查詢從v1.0以後的提交歷史記錄(不包含v1.0)。

11)按commit

  1. git log commit:查詢commit之前的記錄,包含commit
  2. git log commit1 commit2:查詢commit1commit2之間的記錄,包括commit1commit2
  3. git log commit1..commit2:同上,但是不包括commit1

說明:

  • 其中,commit可以是提交雜湊值的簡寫模式,也可以使用HEAD代替。
  • HEAD代表最後一次提交,HEAD^為最後一個提交的父提交,等同於HEAD~1
  • HEAD~2代表倒數第二次提交。

提示:Git的指令是非常豐富的,通過git help log 或者git help --web log,可以以瀏覽器的方式檢視更多關於log的指令。

參考:

相關文章