如何找到删除代码的 Git 提交记录?

4
我向一个repo添加了几行代码并提交了它。然后在若干次提交之后,这些行被删除了。
我有添加这些行时的提交哈希值,以及一个随后将其删除的提交哈希值。如何找到确切删除它们的提交?

2个回答

5

您可以使用-S-G选项来调用git log命令。它们之间的区别在于,-S接受一个固定字符串(表示您要匹配的代码行),而-G也会做相同的事情,但是它接受一个正则表达式:

git log --oneline -S 'fixed string'
git log --oneline -G '^foobar$'
-S-G选项可以返回首次引入或移除字符串/正则表达式模式的提交。如果您想查看与提交匹配的差异,甚至可以添加--patch-p选项。根据官方Linux内核的git log文档说明:
-S <string>

Look for differences that introduce or remove an instance of <string>. Note that this is different than the string simply appearing in diff output; see the pickaxe entry in gitdiffcore(7) for more details.

-G <regex>

Look for differences whose added or removed line matches the given <regex>.


-G 和 -S 之间的区别比这更微妙:-S 不会找到出现次数为“pattern”的提交未更改的情况。换句话说,如果例如“pattern”从一个函数调用移动到另一个函数调用,则不会找到它。考虑到 -G 默认也支持正则表达式,我选择它作为我的首选。 - Ev Dolzhenko

2
你可能想要看一下 git-blameall。它显示了文件中存在的每一行,并包含删除行的提交。对于这种取证工作非常有用。

让我们重新开始。相比于https://dev59.com/JYDba4cB1Zd3GeqPGJh6#24193859,`blameall`有什么优势? - Asclepius
@A-B-B 我并不是在为我的答案辩护。我真的想知道它是否能更好地处理假阳性问题。我怀疑它不能,这就是我问的原因。而且你似乎删除了关于它的评论,这很不幸——这是一个有用的对话。顺便说一句,我喜欢blameall,因为它将我想要的东西放在中心屏幕上,并且我可以看到这一行随时间发生了什么变化。是的,你必须处理代码移动等问题,但总的来说它显示了变化得相当好。它的组织可能需要改进,但它很方便。 - John Szakmeister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接