删除/删除行时如何查找提交?

Posted

技术标签:

【中文标题】删除/删除行时如何查找提交?【英文标题】:How to find commit when line was deleted/removed? 【发布时间】:2012-09-17 11:02:48 【问题描述】:

我的 Git 存储库中的文件中有一个已删除的行。我知道一些缺失的文本,以及它所在的文件,所以我使用了git log -S'missingtext' /path/to/file

但是,唯一返回的是提交,其中我添加了包含缺失文本的行。该文本不存在于 HEAD 中,并且添加它的提交存在于我的分支中,因此我知道我的分支历史记录中的一个提交一定已将其删除,但它没有显示出来。

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

    这就是为什么 pickaxe 找不到删除该行的提交的原因吗? 如果不手动挖掘历史记录,我怎么能找到删除“missingtext”的位置?

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

【问题讨论】:

git log -p/missingtext 而在 less 中是一种快速的“n”脏方法。 How do I "blame" a deleted line的可能重复 【参考方案1】:

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

git log 默认情况下不显示合并提交的差异。试试-c--cc 标志。

更多讨论/解释:https://git-scm.com/docs/git-lognabble.com

来自 git-log 文档:

-c 使用此选项,合并提交的差异输出显示每个父级与合并结果的差异 同时,而不是显示父母和之间的成对差异 结果一次一个。此外,它仅列出了 从所有父母修改。

--cc 该标志暗示了 -c 选项,并通过省略内容在 父母只有两个变体,合并结果选择其中一个 无需修改。

【讨论】:

如果您想查找从已删除文件中删除某行的时间,可以使用git log -c -S'missingtext' -- /path/to/file 如果您不知道哪个文件包含缺少的文本,您可以省略 /path/to/file 并运行 git log -c -S'missingtext' 在 windows 上我必须做 git log -c -S "missingtext" /path/to/file - 注意双引号【参考方案2】:

在超级用户上有一个很好的答案: Git: How do I find which commit deleted a line?

git blame --reverse START.. file.ext

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

【讨论】:

"下一个提交将是删除它的那个。" -这并非总是如此。 blame --reverse 将显示最新的提交 - 按时间戳 - 包含一行,但它可能已被来自不同分支的较早提交删除。【参考方案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

这将包括所有合并更改,因为它明确指定了差异的基本提交。我想出这个是因为git log -c -S... 给了我一堆误报。此外,当我在初始 git log 命令中指定文件路径时,它跳过了我正在寻找的提交。

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

【讨论】:

以上是关于删除/删除行时如何查找提交?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SVN 中查找文件被删除/移动的所有提交(修订号)

删除向量行时如何更快?

如何在 UITableView 中插入和删除行时模拟折纸

添加/删除 UITableView 行时如何防止文本字段变空?

从 UITableView 插入和删除行时如何正确更新数据源?

删除行时如何使多行TextInput缩小(React-Native)?