git log命令主要用于查看Git版本演變歷史(也就是提交歷史),同時根據追加的參數和選項不同,也會有不同的展示效果。
git log命令說明
git log官方文檔說明
git log用于查詢版本的歷史,命令形式如下:
git log [<options>] [<since>..<until>] [[--] <path>...]
列出可以從給定的提交中通過 "父 “鏈接到達的提交,但不包括可以從前面有”^
"的提交中到達的提交。 默認情況下,輸出結果是按時間順序倒置的。
你可以把它看成是一個集合操作。從命令行上給出的任何一個提交中可以到達的提交形成一個集合,然后從這個集合中減去任何一個前面帶有'^'
的提交。 剩下的提交內容就是命令的輸出結果。 其他各種選項和路徑參數也可以用來進一步限制結果。
不帶參數
- 如果不帶任何參數,它會列出所有歷史記錄,最近的排在最上方,顯示提交對象的哈希值,作者、提交日期、和提交說明
- 如果記錄過多,則按上下鍵,
Enter
(向下顯示一行),空格(顯示下一頁),來控制顯示。 - 按
q
鍵退出歷史記錄列表。
按照數量過濾
使用git log
命令時最基本的過濾方式就是按照可以顯示的日志條數進行過濾。如果你只對最近幾次提交感興趣,這會節省在頁面上查看所有提交的麻煩。
git log -3
按照日期過濾
如果你想查找特定時間段的提交歷史,可以使用--after
或者--before
選項來通過日期過濾顯示內容。這兩個選項的值都可以接收不同形式的日期格式。比如下面的命令只顯示2014年7月1日以及之后的提交歷史信息。
git log --after="2018-7-1"
也可以傳遞相對時間比如"1 week ago"
表示一周前或者"yesterday"
表示昨天:
git log --after="yesterday"
如果想尋找時間區間內的提交歷史,可以同時使用--before
和--after
選項。比如為了顯示2018年7月1日到2018年7月4日之間提交可以向下面這樣執行命令:
git log --after="2018-7-1" --before="2018-7-4"
此外需了解的是,git log
命令中還可以使用--since
和--until
選項,他們分別是--after
和--before
的同義詞。
按作者和提交者過濾
如果想查找某個特定作者的提交歷史,可以使用--author
選項。該選項接受一個正則表達式,并且返回所有作者字段符合正則表達式的提交記錄。當然如果你知道作者確切的名稱,也可以直接傳入一個普通字符串而無需使用正則表達式:
git log --author="John"
這條命令會顯示所有由John
提交的記錄。作者名稱并不是必須完全一致,檢索時會匹配包含給定參數的提交記錄。
你也可以通過使用正則表達式來構建更加復雜的搜索方式。比如下面的例子就會去搜索Mary
或者John
提交的記錄。
git log --author="John|Mary"
請注意在作者字段中也包含提交者的email
值,所以你也可以使用此選項來搜索特定email
地址。
如果你的工作流程區分提交人和作者,那么--committer
選項操作也類似。
按照提交信息過濾
如果想按照提交信息過濾提交記錄,可以使用--grep
選項。它的工作方式與--author
選項一致,只不過搜索的目標是提交信息而不是作者信息,僅顯示提交說明中包含指定字符串的提交。
比如說你的團隊規定提交信息中要包含對應的issue
信息,那么就可以使用類似下面的命令來根據issue信息查找特定提交:
git log --grep="JRA-224:"
在使用時可以考慮傳遞-i
選項讓git log
查找提交記錄時忽略大小寫。
注意:如果想同時使用--grep
和--author
,必須在附加一個--all-match
參數。
按照文件過濾
很多時候,你可能只關心含有特定文件變更的提交。要想顯示所有與這個文件相關的提交記錄,那么可以將文件路徑作為參數傳遞給git log
命令。比如下面的例子會返回所有與foo.py
和bar.py
文件有關的提交記錄。
git log -- foo.py bar.py
-(空格)文件或--[后邊沒有文件]
這里的 --
是告訴Git
,后面的參數是文件路徑而不是branch
分支)的名字。 如果后面的文件路徑不會和某個branch
產生混淆,你可以省略 --
,比如 git log foo.py
。
后邊的路徑還支持正則,比如:git log *install.md ,是指定項目路徑下的所有以install.md
結尾文件的提交歷史。
文件名應該放到參數的最后位置,通常在前面加上-
-并用空格隔開表示是文件。
git log file/
可以查看file
文件夾下所有文件的提交記錄。
按照提交內容過濾
想要按照提交的具體內容來過濾提交記錄,也是可以辦到的。比如有時候你想知道添加或者刪除某行代碼的提交,可以使用-S
這樣的參數。
log log -S"<string>"
git log -G"<string>"
#僅顯示添加或刪除內容匹配指定字符串的提交。
有時你想搜索,新增或刪除某行代碼相關的commit
. 可以使用這條命令。
設你想知道Hello,World!
這句話,是什么時候加入到項目里去的,可以用:git log -S"Hello,World!"
如果想以正則表達式進行搜索,而不是通過字符串,那么可以修改一下上面的命令,改為傳入-G
這樣的參數。
這是一個非常有用的debug
工具,使用他可以定位所有跟某行代碼相關的commit
,甚至可以查看某行是什么時候被copy
的,什么時候移到另外一個文件中去的。
注意:-S后沒有"=",與查詢內容之間也沒有空格符。
按照提交區間過濾
你可以向git log
命令傳遞一個表示提交之間的區間來篩選僅在這兩次提交之間的所有提交記錄。對于區間的表示如下所示:
git log ..
git log <since>..<until>
這個命令對于查找兩個分支之間的區別非常有用。考慮下面這個命令:
git log main..feature
main..feature
這個提交區間的表述,會給出所有已經存在于feature
分支但還不存在于main
分支的提交記錄。換句話說,也就是feature
分支已經距離main
分支有多遠了。
請注意如果你對調區間的兩端(feature..main)
,你會得到所有已經存在于main
分支但還未存在于feature
分支的提交記錄。如果git log
命令在執行這兩個區間時都有返回,那么也就意味著你的提交歷史已經分叉了。
如果是三個點,表示或的意思:git log master...test
,意思是查詢master
或test
分支中的提交記錄。
官網說明
<提交 1>…?<提交 2>
,對合并很有用。 由此產生的提交集合是兩個操作數之間的對稱差。 以下兩個命令是等價的:
$ git log A B --not $(git merge-base --all A B)
$ git log A...B
過濾合并提交
git log
命令默認會含有合并提交。但是如果你的團隊策略是“總是使用合并”(比如說總是在功能分支使用merge
來整合上游分支的新變更,而不是將功能分支rebase
到上游分支上),那么項目提交歷史中會有大量冗余的合并提交節點。
通過傳入--no-merges
選項,可以讓git log
命令的輸出過濾掉那些合并提交:
git log --no-merges
另外一方面,如果你只對合并提交感興趣,也可以使用--merge
選項
git log --merges
這會輸出所有含有兩個及以上分支的提交記錄。
按標簽tag
git log --tages=v1.0
直接這樣是查詢標簽之前的commit。
加兩個點,例如:git log --tages=v1.0..
,是查詢從v1.0以后的提交歷史記錄(不包含v1.0)。
按分支
git log --
--branchName
branchName參數:為任意一個分支名字,查看某個分支上的提交記錄。
需要放到參數中的最后位置處。
如果分支名與文件名相同,系統會提示錯誤,可通過–選項,來指定給定的參數,是分支名還是文件名。
比如:在當前分支中有一個名為v1的文件,同時還存在一個名為v1的分支。如下:
git log v1 -- #此時的v1代表的是分支名字(--后邊是空的)。git log -- v1 #此時的v1代表的是名為v1的文件。git log v1 -- v1 #代表v1分支下的v1文件。
按commit
git log commit #查詢commit之前的記錄,包含commit。
git log commit1 commit2 #查詢commit1與commit2之間的記錄,包括commit1和commit2。
git log commit1..commit2 # 同上,但是不包括commit1。
說明:
- 其中,
commit
可以是提交哈希值的簡寫模式,也可以使用HEAD
代替。 HEAD
代表最后一次提交,HEAD^
為最后一個提交的父提交,等同于HEAD~1
。HEAD~2
代表倒數第二次提交。