正如标题所说,我想找到其差异包含特定字符串的每个提交。
目前,我使用
git log -p 'filename'
其中显示的不像每个diff的界面,我搜索字符串。 然后我回溯找到实际的提交消息。
简单的替代方法可能是将git log -p传递给grep,但是我无法找到提交ID或消息。
答案 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, ®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条目。
答案 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