如何使用 git 查找已删除的行?

mus*_*tze 4 git version-control

有时,我想重新添加一些我前段时间从存储库中删除的代码。我总是使用诸如tig浏览历史记录之类的工具来查找删除了某些行的提交。

有没有办法用 git 找到删除的行?类似于git-grep但对于提交内容而不是提交消息?

Gre*_*con 9

如果您记得删除的行中的某些关键字,例如变量或函数的名称,请使用镐搜索,

git log -Skeyword
Run Code Online (Sandbox Code Playgroud)

或查看增量以及提交消息

git log -p -Skeyword
Run Code Online (Sandbox Code Playgroud)

虽然-S搜索精确字符串匹配la fgrep,但您可以搜索正则表达式匹配-G

请注意,-S或的参数-G是“拥抱”的,中间没有空格。

文档:

-S<string>

查找更改文件中指定字符串(即添加/删除)出现次数的差异。供脚本编写者使用。

当您正在寻找确切的代码块(如 a struct),并想知道该块自首次出现以来的历史时,它很有用:迭代地使用该功能将原像中有趣的块反馈回-S,并继续前进,直到您获得该块的第一个版本。

-G<regex>

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

为了说明之间的区别-S<regex> --pickaxe-regex,并-G<regex>考虑在同一个文件中的以下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 [转载如下] 中的镐条目。


diffcore-pickaxe:用于检测指定字符串的添加/删除

此转换将文件对集限制为以某种方式更改原图像和后图像之间指定字符串的文件对。-S<block of text>-G<regular expression>选项用于指定寻找这些字符串的不同方式。

-S<block of text>检测其原像和后像具有不同出现次数的指定文本块的文件对。根据定义,它不会检测文件内移动。此外,当变更集在不影响感兴趣的字符串的情况下批量移动文件时,diffcore-rename 会像往常一样启动,并-S省略文件对(因为在重命名检测到的文件对中该字符串的出现次数没有改变)。与 一起使用时--pickaxe-regex,将文本块视为要匹配的扩展 POSIX 正则表达式,而不是文字字符串。

-G<regular expression>(助记符grep:)检测其文本差异具有与给定正则表达式匹配的添加或删除行的文件对。这意味着它将检测文件内(或重命名检测认为相同文件的内容)移动,这是噪音。该实现运行两次 diff 和 grep,这可能非常昂贵。

-S-G不带 使用时--pickaxe-all,只有匹配各自标准的文件对才会保留在输出中。当--pickaxe-all使用时,即使一个filepair匹配它们各自的标准在一个变更中,整个变更被保持。此行为旨在更轻松地查看整个变更集上下文中的更改。