今天早些时候我发现我的git存储库中缺少一些代码.我知道一些丢失的文本,以及它所在的文件,所以我使用了git log -S'missingtext' /path/to/file
.然而,唯一回来的是我添加了包含缺失文本的行的提交.HEAD中没有文本,添加它的提交存在于我的分支中,所以我知道我的分支历史中的一个提交必须删除它,但它没有显示出来.
经过一些手动搜索,结果发现在解决合并冲突时意外删除了该行.所以我想知道:
对#1的任何见解都会很棒(我认为这git log -S
会给我答案),但我真正的问题是#2,因为我希望将来可以避免这种情况.
let*_*two 65
git log
默认情况下不会显示合并提交的差异.该-c
或--cc
标志应该做的伎俩:
git log -c -S'missingtext' /path/to/file
这里有更多的讨论/解释.
快速而肮脏的方式#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
Run Code Online (Sandbox Code Playgroud)
这将包括所有合并更改,因为它明确指定了差异的基本提交。我想出这个是因为git log -c -S...
给了我一堆误报。此外,当我在初始git log
命令中指定文件路径时,它跳过了我正在寻找的提交。
由于这可能会运行一段时间,如果您只需要 1 个结果,您可以-n
在git log
命令上指定或&& break
在循环末尾放置一个。
超级用户对此的很好答案:https : //superuser.com/questions/541681/git-how-do-i-find-which-commit-deleted-a-line
git blame --reverse START.. file.ext
Run Code Online (Sandbox Code Playgroud)
对于每行,这将显示该行所在的最后一个提交-例如哈希0123456789。接下来的下一个提交将是删除该行的提交。使用git log
并搜索哈希0123456789-然后进行后续提交。