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

bba*_*a42 21 git dvcs

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

目前,我使用

git log -p 'filename'
Run Code Online (Sandbox Code Playgroud)

这显示不像每个差异的界面,我搜索字符串.然后我回溯找到实际的提交消息.

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

Dav*_*vid 26

git log -p -S'string'
Run Code Online (Sandbox Code Playgroud)

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


tor*_*rek 15

下面是提取的电流分支可达的提交影响REV-数为一行shell脚本(分割成多条线路进行格式化的目的)path,其中git show -p包含给定的pattern.它并不完美(它会匹配提交消息以及差异)但是从这里开始调整你应该很容易.

git rev-list HEAD -- path |
while read rev; do
    if git show -p $rev | grep pattern >/dev/null; then
        echo $rev
    fi
done
Run Code Online (Sandbox Code Playgroud)

请注意,您可以替换git show为,例如,git diff $rev^ $rev(请注意,这只会与第一个父级比较,如果它是合并),或者git whatchanged $rev或者您喜欢的任何内容.主要技巧是首先git rev-list提取所有候选项(影响给定路径的提交;省略-- path部分以从中获取所有提交HEAD).有关您可以使用的许多其他事项,请参阅git-rev-list(1)git rev-list.


Lik*_*eyn 12

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

git-log的手册页:

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

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

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

虽然git log -G"regexec(regexp"将显示此提交,git log -S"regexec(regexp"--pickaxe-regex不会(因为该字符串的出现次数没有改变).

有关更多信息,请参阅gitdiffcore(7)中的pickaxe条目.


nin*_*rod 5

git log --all -G'my_search' -i -m -p
Run Code Online (Sandbox Code Playgroud)

助记符: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 -
Run Code Online (Sandbox Code Playgroud)

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