Git历史记录 - 按关键字查找丢失的行

Nik*_*hev 44 git version-control

我在我的Git存储库中有一个包含单词"Foo"的行,之前有几百个提交.

如果有没有办法找到它的修订号,那是最后一次没有购买FishEye?

Von*_*onC 83

这可以通过pickaxe(-S)选项来解决gitlog

 git log -SFoo -- path_containing_change
Run Code Online (Sandbox Code Playgroud)

(你甚至可以添加一个时间范围:--since=2009.1.1 --until=2010.1.1)

-S<string>
Run Code Online (Sandbox Code Playgroud)

寻找引入或删除实例的差异<string>.
请注意,这与简单地出现在diff输出中的字符串不同; 有关更多详细信息,请参阅gitdiffcore(7)中的pickaxe条目.

diffcore-pickaxe
Run Code Online (Sandbox Code Playgroud)

此转换用于查找表示接触指定字符串的更改的文件对.
diffcore-pickaxe在使用时,它会检查是否有filepairs其"原始"方有指定的字符串,其"结果"的一面没有.
这样的文件对表示"此变更集中出现的字符串".
它还检查丢失指定字符串的相反情况.


2014年更新:

从那以后,你可以做(​​从nilbus回答):

git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'
Run Code Online (Sandbox Code Playgroud)

这些日志命令列出了添加或删除给定搜索字符串/正则表达式的提交,(通常)最近更新.
-p(--patch)选项会显示相关的差异,其中已添加或删除的模式,所以你可以看到它在上下文中.

找到一个添加了你正在寻找的文本的相关提交(例如8beeff00d),找到包含提交的分支:

git branch -a --contains 8beeff00d
Run Code Online (Sandbox Code Playgroud)

(我在" 如何列出包含给定提交的分支? "中引用了最后一个命令.)