今天早些时候我发现我的git存储库中缺少一些代码。我知道一些丢失的文本及其所在的文件,因此我使用了git log -S'missingtext' /path/to/file
。然而,唯一回来的是我添加了包含缺失文本的行的提交。 HEAD中没有文本,添加它的提交存在于我的分支中,所以我知道我的分支历史中的一个提交必须删除它,但它没有显示出来。
经过一些手动搜索,结果发现在解决合并冲突时意外删除了该行。所以我想知道:
对#1的任何见解都会很棒(我假设git log -S
会给我答案),但我真正的问题是#2,因为我希望将来可以避免这种情况。 / p>
答案 0 :(得分:57)
答案 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
。