查找何时删除行


76

今天早些时候,我发现我的Git存储库中缺少一些代码。我知道一些缺少的文本以及它所在的文件,因此我使用了git log -S'missingtext' /path/to/file

但是,返回的唯一内容是提交,其中添加了包含缺少文本的行。文本不在HEAD中,添加的提交也存在于我的分支中,因此我知道分支历史中的某个提交一定已将其删除,但没有出现。

经过一些手动搜索后,结果发现该行在解决合并冲突时被意外删除。所以我想知道:

  1. 这是镐无法找到删除该行的提交的原因吗?
  2. 在不手动浏览历史记录的情况下,如何找到删除“ missingtext”的位置?

关于#1的任何见解都是很棒的(我认为这git log -S会给我答案),但是我真正的问题是#2,因为我希望将来能够避免这种情况。


7
git log -p并且/missingtext同时less是一个快速“N”肮脏的方式做到这一点。
nneonneo 2012年

Answers:


102

git log默认情况下不显示合并提交的差异。该-c--cc标志应该做的伎俩:

git log -c -S'missingtext' /path/to/file

更多讨论/解释在这里


2
如果要查找何时从已删除文件中删除一行,可以使用git log -c -S'missingtext' -- /path/to/file
乔纳森

3
如果您不知道哪个文件包含丢失的文本,则可以省略/path/to/file并直接运行git log -c -S'missingtext'
Aryeh Beitz

2
在Windows上,我必须执行git log -c -S“ missingtext” / path / to /
file-

13

超级用户对此有一个很好的答案: Git:如何找到哪个提交删除了一行?

git blame --reverse START.. file.ext

对于每行,这将显示该行所在的最后一个提交-例如哈希0123456789。接下来的下一个提交将是删除该行的提交。使用git log并搜索哈希0123456789,然后搜索其后继提交。


“接下来的下一个提交将是删除它的提交。” -这并非总是如此。将blame --reverse展示最新的承诺-通过标记-包含一条线,但它可能已被删除的早期从不同的分支提交。
Superole

3

快速而肮脏的方法#2-使用for循环。

for commit in $(git log --pretty='%H'); do
    git diff -U0 --ignore-space-change "$commit^" "$commit" | grep '^-.*missingtext' > /dev/null && echo "$commit"
done

这将包括所有合并更改,因为它明确指定了diff的基本提交。我想出这个是因为git log -c -S...给了我很多假阳性。另外,当我在初始位置指定文件路径时git log命令中,它会跳过我正在寻找的提交。

由于这可能会运行一段时间,因此您可以-ngit log命令上指定,&& break如果只需要1个结果,则可以在循环末尾放置一个。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.