删除/删除行时如何查找提交?
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
。
【讨论】:
以上是关于删除/删除行时如何查找提交?的主要内容,如果未能解决你的问题,请参考以下文章
添加/删除 UITableView 行时如何防止文本字段变空?