正如标题所说,我想找到其差异包含特定字符串的每个提交.
目前,我使用
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进行提交:
Run Code Online (Sandbox Code Playgroud)+ return !regexec(regexp, two->ptr, 1, ®match, 0); ... - hit = !regexec(regexp, mf2.ptr, 1, ®match, 0);
虽然git log -G"regexec(regexp"将显示此提交,git log -S"regexec(regexp"--pickaxe-regex不会(因为该字符串的出现次数没有改变).
有关更多信息,请参阅gitdiffcore(7)中的pickaxe条目.
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 为我突出显示了补丁。