找到删除行的时间

时间:2012-09-25 21:22:01

标签: git

今天早些时候我发现我的git存储库中缺少一些代码。我知道一些丢失的文本及其所在的文件,因此我使用了git log -S'missingtext' /path/to/file。然而,唯一回来的是我添加了包含缺失文本的行的提交。 HEAD中没有文本,添加它的提交存在于我的分支中,所以我知道我的分支历史中的一个提交必须删除它,但它没有显示出来。

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

  1. 这就是为什么pickaxe找不到删除该行的提交的原因吗?
  2. 如果不手动挖掘历史记录,我怎么能找到删除“missingtext”的地方?
  3. 对#1的任何见解都会很棒(我假设git log -S会给我答案),但我真正的问题是#2,因为我希望将来可以避免这种情况。 / p>

3 个答案:

答案 0 :(得分:57)

默认情况下,

git log未显示合并提交的差异。 -c--cc标志应该可以解决问题:

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

更多讨论/解释here

答案 1 :(得分:3)

超级用户对此有很好的回答:https://superuser.com/questions/541681/git-how-do-i-find-which-commit-deleted-a-line

git blame --reverse START.. file.ext

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

答案 2 :(得分:0)

快速而肮脏的方式#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命令中指定文件路径时,它跳过了我正在寻找的提交。

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