2009-08-26 117 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