找到删除行的时间

mat*_*anm 45 git

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

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

  1. 这是为什么pickaxe找不到删除该行的提交的原因?
  2. 如果不手动挖掘历史记录,我怎么能找到删除"missingtext"的地方?

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

let*_*two 65

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

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

这里有更多的讨论/解释.

  • 这显示了 /path/to/file 中甚至不包含“missingtext”的提交 (4认同)
  • 如果您想查找何时从已删除的文件中删除了一行,您可以使用 `git log -c -S'missingtext' -- /path/to/file`。 (3认同)
  • 如果您不知道哪个文件包含缺少的文本,则可以省略`/ path / to / file`并运行`git log -c -S'missingtext'。 (2认同)
  • 在 Windows 上我必须执行 git log -c -S "missingtext" /path/to/file - 注意双引号 (2认同)

wol*_*ude 6

快速而肮脏的方式#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 个结果,您可以-ngit log命令上指定或&& break在循环末尾放置一个。


Jam*_*mes 6

超级用户对此的很好答案: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-然后进行后续提交。

  • “下一个要遵循的提交将是删除它的那个。” -这并非总是如此。`blame --reverse` 将按时间戳显示最新提交以包含一行,但它可能已被来自不同分支的早期提交删除。 (2认同)