Git log高级用法
格式化Log輸出
首先,這篇文章會(huì)展示幾種git log格式化輸出的例子。大多數(shù)例子只是通過(guò)標(biāo)記向git log請(qǐng)求或多或少的信息。
如果你不喜歡默認(rèn)的git log格式,你可以用git config的別名功能來(lái)給你想要的格式創(chuàng)建一個(gè)快捷方式。
Oneline
--oneline標(biāo)記把每一個(gè)提交壓縮到了一行中。它默認(rèn)只顯示提交ID和提交信息的第一行。git log --oneline的輸出一般是這樣的:
0e25143 Merge branch 'feature' ad8621a Fix a bug in the feature 16b36c6 Add a new feature 23ad9ad Add the initial code base它對(duì)于獲得項(xiàng)目的總體情況很有幫助。
Decorate
很多時(shí)候,知道每個(gè)提交關(guān)聯(lián)的分支或者標(biāo)簽很有用。--decorate標(biāo)記讓git log顯示指向這個(gè)提交的所有引用(比如說(shuō)分支、標(biāo)簽等)。
這可以和另一個(gè)配置項(xiàng)一起使用。比如,執(zhí)行g(shù)it log --oneline --decorate?會(huì)將提交歷史格式化成這樣:
0e25143 (HEAD, master) Merge branch 'feature' ad8621a (feature) Fix a bug in the feature 16b36c6 Add a new feature 23ad9ad (tag: v0.9) Add the initial code base在這個(gè)例子中,你(通過(guò)HEAD標(biāo)記)可以看到最上面那個(gè)提交已經(jīng)被checkout了,而且它還是master分支的尾端。第二個(gè)提交有另一個(gè)feature分支指向它,以及最后那個(gè)提交帶有v0.9標(biāo)簽。
分支、標(biāo)簽、HEAD還有提交歷史是你Git倉(cāng)庫(kù)中包含的所有信息。因此,這個(gè)命令讓你更完整地觀察項(xiàng)目結(jié)構(gòu)。
Diff
git log提供了很多選項(xiàng)來(lái)顯示兩個(gè)提交之間的差異。其中最常用的兩個(gè)是--stat和-p。
--stat選項(xiàng)顯示每次提交的文件增刪數(shù)量(注意:修改一行記作增加一行且刪去一行),當(dāng)你想要查看提交引入的變化時(shí)這會(huì)非常有用。比如說(shuō),下面這個(gè)提交在hello.py文件中增加了67行,刪去了38行。
commit f2a238924e89ca1d4947662928218a06d39068c3 Author: John <john@example.com> Date: Fri Jun 25 17:30:28 2014 -0500Add a new featurehello.py | 105 ++++++++++++++++++++++++-----------------1 file changed, 67 insertion(+), 38 deletions(-)文件名后面+和-的數(shù)量是這個(gè)提交造成的更改中增刪的相對(duì)比例。它給你一個(gè)直觀的感覺(jué),關(guān)于這次提交有多少改動(dòng)。如果你想知道每次提交刪改的絕對(duì)數(shù)量,你可以將-p?選項(xiàng)傳入git log?。這樣提交所有的刪改都會(huì)被輸出:
commit 16b36c697eb2d24302f89aa22d9170dfe609855b Author: Mary <mary@example.com> Date: Fri Jun 25 17:31:57 2014 -0500Fix a bug in the featurediff --git a/hello.py b/hello.py index 18ca709..c673b40 100644 --- a/hello.py +++ b/hello.py @@ -13,14 +13,14 @@ B -print("Hello, World!") +print("Hello, Git!")對(duì)于改動(dòng)很多的提交來(lái)說(shuō),這個(gè)輸出會(huì)變得又長(zhǎng)又大。一般來(lái)說(shuō),當(dāng)你輸出所有刪改的時(shí)候,你是想要查找某一具體的改動(dòng),這時(shí)你就要用到pickaxe?選項(xiàng)。
Shortlog
git shortlog是一種特殊的git log?,它是為創(chuàng)建發(fā)布聲明設(shè)計(jì)的。它把每個(gè)提交按作者分類(lèi),顯示提交信息的第一行。這樣可以容易地看到誰(shuí)做了什么。
比如說(shuō),兩個(gè)開(kāi)發(fā)者為項(xiàng)目貢獻(xiàn)了5個(gè)提交,那么git shortlog?輸出會(huì)是這樣的:
Mary (2):Fix a bug in the featureFix a serious security hole in our frameworkJohn (3):Add the initial code baseAdd a new featureMerge branch 'feature'默認(rèn)情況下,git shortlog把輸出按作者名字排序,但你可以傳入-n選項(xiàng)來(lái)按每個(gè)作者提交數(shù)量排序。
Graph
--graph?選項(xiàng)繪制一個(gè)ASCII圖像來(lái)展示提交歷史的分支結(jié)構(gòu)。它經(jīng)常和?--oneline和?--decorate兩個(gè)選項(xiàng)一起使用,這樣會(huì)更容易查看哪個(gè)提交屬于哪個(gè)分支:
git log --graph --oneline --decorate For a simple repository with just 2 branches, this will produce the following:* 0e25143 (HEAD, master) Merge branch 'feature' |\ | * 16b36c6 Fix a bug in the new feature | * 23ad9ad Start a new feature * | ad8621a Fix a critical security issue |/ * 400e4b7 Fix typos in the documentation * 160e224 Add the initial code base星號(hào)表明這個(gè)提交所在的分支,所以上圖的意思是23ad9ad和16b36c6這兩個(gè)提交在topic分支上,其余的在master分支上。
雖然這對(duì)簡(jiǎn)單的項(xiàng)目來(lái)說(shuō)是個(gè)很好用的選擇,但你可能會(huì)更喜歡gitk或SourceTree這些更強(qiáng)大的可視化工具來(lái)分析大型項(xiàng)目。
自定義格式
對(duì)于其他的git log格式需求,你都可以使用--pretty=format:"<string>"選項(xiàng)。它允許你使用像printf一樣的占位符來(lái)輸出提交。
比如,下面命令中的%cn、%h?和%cd這三種占位符會(huì)被分別替換為作者名字、縮略標(biāo)識(shí)和提交日期。
git log --pretty=format:"%cn committed %h on %cd" This results in the following format for each commit:John committed 400e4b7 on Fri Jun 24 12:30:04 2014 -0500 John committed 89ab2cf on Thu Jun 23 17:09:42 2014 -0500 Mary committed 180e223 on Wed Jun 22 17:21:19 2014 -0500 John committed f12ca28 on Wed Jun 22 13:50:31 2014 -0500完整的占位符清單可以在文檔中找到。
除了讓你只看到關(guān)注的信息,這個(gè)--pretty=format:"<string>"?選項(xiàng)在你想要在另一個(gè)命令中使用日志內(nèi)容是尤為有用的。
過(guò)濾提交歷史
格式化提交輸出只是git log其中的一個(gè)用途。另一半是理解如何瀏覽整個(gè)提交歷史。接下來(lái)的文章會(huì)介紹如何用git log選擇項(xiàng)目歷史中的特定提交。所有的用法都可以和上面討論過(guò)的格式化選項(xiàng)結(jié)合起來(lái)。
按數(shù)量
git log最基礎(chǔ)的過(guò)濾選項(xiàng)是限制顯示的提交數(shù)量。當(dāng)你只對(duì)最近幾次提交感興趣時(shí),它可以節(jié)省你一頁(yè)一頁(yè)查看的時(shí)間。
你可以在后面加上-<n>選項(xiàng)。比如說(shuō),下面這個(gè)命令會(huì)顯示最新的3次提交:
git log -3按日期
如果你想要查看某一特定時(shí)間段內(nèi)的提交,你可以使用--after?或?--before?標(biāo)記來(lái)按日期篩選。它們都接受好幾種日期格式作為參數(shù)。比如說(shuō),下面的命令會(huì)顯示2014年7月1日后(含)的提交:
git log --after="2014-7-1"你也可以傳入相對(duì)的日期,比如一周前("1 week ago")或者昨天("yesterday"):
get log --after="yesterday"你可以同時(shí)提供--before?和?--after?來(lái)檢索兩個(gè)日期之間的提交。比如,為了顯示2014年7月1日到2014年7月4日之間的提交,你可以這么寫(xiě):
git log --after="2014-7-1" --before="2014-7-4"注意--since?、--until?標(biāo)記和--after?、--before標(biāo)記分別是等價(jià)的。
按作者
當(dāng)你只想看某一特定作者的提交的時(shí)候,你可以使用--author標(biāo)記。它接受正則表達(dá)式,返回所有作者名字滿足這個(gè)規(guī)則的提交。如果你知道那個(gè)作者的確切名字你可以直接傳入文本字符串:
git log --author="John"它會(huì)顯示所有作者叫John的提交。作者名不一定是全匹配,只要包含那個(gè)子串就會(huì)匹配。
你也可以用正則表達(dá)式來(lái)創(chuàng)建更復(fù)雜的檢索。比如,下面這個(gè)命令檢索名叫Mary或John的作者的提交。
git log --author="John\|Mary"注意作者的郵箱地址也算作是作者的名字,所以你也可以用這個(gè)選項(xiàng)來(lái)按郵箱檢索。
如果你的工作流區(qū)分提交者和作者,--committer也能以相同的方式使用。
按提交信息
按提交信息來(lái)過(guò)濾提交,你可以使用--grep標(biāo)記。它和上面的--author標(biāo)記差不多,只不過(guò)它搜索的是提交信息而不是作者。
比如說(shuō),你的團(tuán)隊(duì)規(guī)范要求在提交信息中包括相關(guān)的issue編號(hào),你可以用下面這個(gè)命令來(lái)顯示這個(gè)issue相關(guān)的所有提交:
git log --grep="JRA-224:"你也可以傳入-i參數(shù)來(lái)忽略大小寫(xiě)匹配。
按文件
很多時(shí)候,你只對(duì)某個(gè)特定文件的更改感興趣。為了顯示某個(gè)特定文件的歷史,你只需要傳入文件路徑。比如說(shuō),下面這個(gè)命令返回所有和foo.py和bar.py文件相關(guān)的提交:
git log -- foo.py bar.py--告訴git log接下來(lái)的參數(shù)是文件路徑而不是分支名。如果分支名和文件名不可能沖突,你可以省略--。
按內(nèi)容
我們還可以根據(jù)源代碼中某一行的增加和刪除來(lái)搜索提交。這被稱為pickaxe,它接受形如-S"<string>"的參數(shù)。比如說(shuō),當(dāng)你想要知道Hello, World!字符串是什么時(shí)候加到項(xiàng)目中哪個(gè)文件中去的,你可以使用下面這個(gè)命令:
git log -S "Hello, World!"如果你想用正則表達(dá)式而不是字符串來(lái)搜索,你可以使用-G"<regex>"標(biāo)記。
這是一個(gè)非常強(qiáng)大的調(diào)試工具,它能讓你定位到所有影響代碼中特定一行的提交。它甚至可以讓你看到某一行是什么時(shí)候復(fù)制或者移動(dòng)到另一個(gè)文件中去的。
按范圍
你可以傳入范圍來(lái)篩選提交。這個(gè)范圍由下面這樣的格式指定,其中<since>和<until>是提交的引用:
git log <since>..<until>這個(gè)命令在你使用分支引用作為參數(shù)時(shí)特別有用。這是顯示兩個(gè)分支之間區(qū)別最簡(jiǎn)單的方式。看看下面這個(gè)命令:
git log master..feature其中的master..feature范圍包含了在feature分支而不在master分支中所有的提交。換句話說(shuō),這個(gè)命令可以看出從master分支fork到feature分支后發(fā)生了哪些變化。它可以這樣可視化:
注意如果你更改范圍的前后順序(feature..master),你會(huì)獲取到master分支而非feature分支上的所有提交。如果git log輸出了全部?jī)蓚€(gè)分支的提交,這說(shuō)明你的提交歷史已經(jīng)分叉了。
過(guò)濾合并提交
git log輸出時(shí)默認(rèn)包括合并提交。但是,如果你的團(tuán)隊(duì)采用強(qiáng)制合并策略(意思是merge你修改的上游分支而不是將你的分支rebase到上游分支),你的項(xiàng)目歷史中會(huì)有很多外來(lái)的提交。
你可以通過(guò)--no-merges標(biāo)記來(lái)排除這些提交:
git log --no-merges另一方面,如果你只對(duì)合并提交感興趣,你可以使用--merges標(biāo)記:
git log --merges它會(huì)返回所有包含兩個(gè)父節(jié)點(diǎn)的提交。
總結(jié)
你現(xiàn)在應(yīng)該對(duì)使用git log來(lái)格式化輸出和選擇你要顯示的提交的用法比較熟悉了。它允許你查看你項(xiàng)目歷史中任何需要的內(nèi)容。
這些技巧是你Git工具箱中重要的部分,不過(guò)注意git log往往和其他Git命令連著使用。當(dāng)你找到了你要的提交,你把它傳給git checkout?、git revert?或是其他控制提交歷史的工具。所以,請(qǐng)繼續(xù)堅(jiān)持Git高級(jí)用法的學(xué)習(xí)。
總結(jié)
以上是生活随笔為你收集整理的Git log高级用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python 存储模型
- 下一篇: Github高级搜索技巧