显示其diff包含特定字符串的所有提交

时间:2013-08-21 17:39:13

标签: git dvcs

正如标题所说,我想找到其差异包含特定字符串的每个提交。

目前,我使用

git log -p 'filename'

其中显示的不像每个diff的界面,我搜索字符串。 然后我回溯找到实际的提交消息。

简单的替代方法可能是将git log -p传递给grep,但是我无法找到提交ID或消息。

7 个答案:

答案 0 :(得分:26)

git log -p -S'string'

可用于搜索添加或删除字符串的提交。它的行为并不完全相同,因为它只匹配实际添加或删除模式实例的提交,而不是(例如)提交它在diff上下文中发生的位置。但也许这对你来说已经足够了。

答案 1 :(得分:16)

这是一个单线程shell脚本(为了格式化而分成多行),它提取影响path的当前分支可达提交的rev-number,其中git show -p包含给定{ {1}}。它并不完美(它会匹配提交消息以及差异),但是从这里开始,你应该很容易调整它。

pattern

请注意,您可以将git rev-list HEAD -- path | while read rev; do if git show -p $rev | grep pattern >/dev/null; then echo $rev fi done 替换为git show(请注意,这只会与第一个父级进行比较,如果它是合并的),或git diff $rev^ $rev,或者您喜欢的任何内容。主要技巧是从git whatchanged $rev开始提取所有候选项(影响给定路径的提交;省略git rev-list部分以从-- path开始获取所有提交)。有关HEAD可以执行的许多其他操作,请参阅git-rev-list(1)

答案 2 :(得分:11)

我知道这个问题现在已经回答了一段时间,但我也遇到了这个问题并找到了不同的解决方案,所以我想我会分享。 Git-log -G 开关应该执行你正在进行的操作,其中 -S 开关只输出提交数量匹配字符串的出现发生变化。

来自git-log的手册页:

  

-G       查找补丁文本中包含匹配的添加/删除行的差异。

     

为了说明-S --pickaxe-regex和-G之间的区别,请考虑在同一文件中使用以下差异进行提交:

+    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不会)(因为它的出现次数字符串没有改变。)

     

有关详细信息,请参阅gitdiffcore(7)中的pickaxe条目。

答案 3 :(得分:3)

git log --all -G'my_search' -i -m -p

助记符:git log all GIMP

  • --all:搜索所有可能的路径,而不仅仅是通过HEAD。
  • -G:比-S更通用,因为-S仅搜索显示my_search出现次数不同的差异。 -G搜索完整差异并接受正则表达式。
  • -i [可选]:使-G忽略大小写。
  • -m:默认情况下,git log不会为合并提交输出差异。 -m更改了此默认行为,使合并提交输出完整差异。这很关键:如果格式错误的合并提交更改了您的行,那么如果没有-m,您将看不到。
  • -p:还为找到的每个提交输出完整补丁。

您甚至可以将其连接到vim。我发现它非常有用:

git log --no-color --all -G'regex' -i -m -p | vim -

我在这里使用--no-color,因为vim会为我突出显示补丁。

答案 4 :(得分:1)

如果您使用的是Linux,请通过egrep管道并搜索正则表达式

git log -p 'filename' | egrep '(yourstring|commit-message)'

答案 5 :(得分:0)

您是否考虑过使用pipe和grep命令?

示例:

 git log -p | grep 'filename'

答案 6 :(得分:0)

您可以使用git,例如:

git log --grep="filename"

或在特定文件上:

git log --grep="filename" README