2009-08-26 28 views
457

在Git代碼庫中,我想列出包含某個單詞的所有提交。我想這如何grep Git爲某個單詞提交差異或內容?

git log -p | grep --context=4 "word" 

,但它並不一定給我回的文件名(除非它是小於5條 線從我搜索這個詞了。我也試過

git grep "word" 

,但它給了我只顯示文件而不顯示歷史記錄

如何搜索整個歷史記錄以便我可以關注特定單詞的變化?我的意思是搜索我的代碼庫以查找單詞的出現情況以追蹤更改(在文件歷史記錄中搜索)。

回答

659

如果你想找到所有提交哪裏提交信息包含給定詞,使用

$ git log --grep=word 

如果你想發現其中添加或移除「字」在文件內容所有提交(更精確地說:這裏的「字」改爲OCCURENCES數),即搜索提交內容,使用所謂的「鶴嘴鋤」與

$ git log -Sword 

搜索在現代混帳還有

$ git log -Gword 

尋找差異其添加或刪除線相匹配「字」(也提交內容)。

請注意,默認情況下,-G接受正則表達式,而-S接受字符串,但可以修改爲使用--pickaxe-regex接受正則表達式。

爲了說明-S<regex> --pickaxe-regex-G<regex>之間的區別,可以考慮在同一個文件中的以下DIFF提交:

+ return !regexec(regexp, two->ptr, 1, &regmatch, 0); 
... 
- hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0); 

雖然git log -G"regexec\(regexp"將顯示此承諾,git log -S"regexec\(regexp" --pickaxe-regex不會(因爲出現的次數的字符串沒有改變)。

+5

'git log -S字'也適用於第二種情況 – 2013-02-07 16:55:54

+0

* -S- *和* -G *在'man git log'中很不清楚。我必須閱讀和實驗三次才能發現差異。 – 2013-10-01 14:06:13

+3

@TankorSmash'-S '尋找引入或移除實例的差異。 '-G '尋找添加或刪除的行與給定的匹配的差異。 – 2013-11-04 20:19:42

239

git log的鶴嘴鋤會發現提交與變化,包括‘字’與git log -Sword

+55

這並不完全準確。 -S 尋找引入或刪除實例的差異。 **請注意,這與字符串簡單地出現在diff輸出中不同; ** – mayu 2011-08-11 02:34:11

+4

雖然這通常是正確的答案,但我只是爲了鼓勵其他人閱讀此答案而低估了它(http://stackoverflow.com/a/1340245/ 586983)有3種不同的方式,並解釋他們的微妙之處。 – jakeonrails 2016-01-07 19:18:42

+9

gosh!我認爲這不是一個很好的理由來降低正確的答案......你不確定包括評論中的鏈接是否足夠鼓勵? – Deborah 2016-06-24 04:53:09

3

要在正則表達式使用布爾連接器:

git log --grep '[0-9]*\|[a-z]*' 

這個正則表達式搜索正則表達式[0-9] *或[A-Z] *上提交消息。

6

另一種方式/語法來做到這一點是:git log -S "word"
這樣你就可以搜索例如git log -S "with whitespaces and stuff @/#ü !"

9

大量實驗後,我可以推薦以下,這表明,引入或刪除包含行提交一個給定的正則表達式,並顯示每個文本的變化,顏色顯示單詞添加和刪除。

git log --pickaxe-regex -p --color-words -S "<regexp to search for>" 

需要一段時間來,雖然運行... ;-)

6

你可以試試下面的命令:

git log --patch --color=always | less +/searching_string 

或以下列方式使用grep

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string' 

在您想要搜索的父目錄中運行此命令。

+2

我喜歡這種方法,因爲我看到的提交有數百行無關的更改,而我只對涉及我正在搜索的單詞的實際修補程序感興趣。要使用'git log --patch --color = always |少加+/searching_string'。 – 2016-10-16 19:17:50