假设我将一个分支合并到我的主分支,工作了一段时间,然后意识到合并后引入了一些错误。
如何查看合并中受影响的文件列表,然后逐个查看它们的差异?
答案 0 :(得分:2)
git bisect
,正如另一个答案中所建议的那样,对于跟踪哪个提交引入了一个错误肯定非常有用,并且很可能很快找到你的问题。但是,合并提交可能是错误的,但无论如何,对您的问题的直接回答可能会很有趣。
首先,您应该找到您感兴趣的合并提交的对象名称(即SHA1 sum),可能是git log --graph --pretty=oneline
或gitk
- 让我们说这个合并提交的对象名称以这个例子是d8fa
。
在git中,提交是根据树的完整快照定义的,而不是对树的更改,对于与两个(或更多)父项的合并与任何其他提交一样,这也是如此。因此,对于合并提交所改变的内容,可能最明显的问题是“这个合并的每个父级的变化是什么?”您可以将第一个父级称为d8fa^1
,将第二个父级称为d8fa^2
,这样您就可以看到哪些文件已更改为:
git diff --stat d8fa^1 d8fa
......和:
git diff --stat d8fa^2 d8fa
或者你可以一起看到这些:
git whatchanged -1 -m --stat d8fa
(您可以将--stat
更改为-p
以查看完整差异,而不是使用git whatchanged
查看diffstat,或者仅使用--stat
忽略git diff
如果你只是想看一个文件对一个父文件的差异,你可以做git diff d8fa^1 d8fa -- README.txt
,例如。)
在大多数情况下,这个输出可能不是很有趣 - 这些主要是在一个父母而不是另一个父母中引入的变化。但是,它还值得检查git show d8fa
的输出 - 如果合并引入的更改似乎不在父系统中,这只会显示补丁作为其输出的一部分,有时称为{ {3}}
答案 1 :(得分:0)
最好的办法是将错误描述为测试,然后使用git bisect
告诉您哪个更改引入了错误。如果你不使用自动化测试,它会更难(不会自动化),但会告诉你导致这个bug的具体变化。
假设你的项目中的人善于沟通小的(做一件事)和描述性(描述那件事情是好的)的变化,那么确切地弄清楚什么是破坏的东西所需的努力是微不足道的。