我发现合并工具很少能帮助我理解冲突或解决方案。在文本编辑器中查看冲突标记并使用 git log 作为补充时,我通常会更成功。
这里有一些提示:
提示一
我发现最好的方法是使用“diff3”合并冲突样式:
git config merge.conflictstyle diff3
这会产生这样的冲突标记:
<<<<<<<
Changes made on the branch that is being merged into. In most cases,
this is the branch that I have currently checked out (i.e. HEAD).
|||||||
The common ancestor version.
=======
Changes made on the branch that is being merged in. This is often a
feature/topic branch.
>>>>>>>
中间部分是共同祖先的样子。这很有用,因为您可以将其与顶部和底部版本进行比较,以更好地了解每个分支上的更改内容,从而更好地了解每个更改的目的。
如果冲突只有几行,这通常会使冲突非常明显。 (知道如何解决冲突是非常不同的;你需要知道其他人在做什么。如果你感到困惑,最好把那个人叫到你的房间,这样他们就可以看到你在看什么在。)
如果冲突时间较长,那么我将三个部分分别剪切并粘贴到三个单独的文件中,例如“我的”、“普通的”和“他们的”。
然后我可以运行以下命令来查看导致冲突的两个 diff hunk:
diff common mine
diff common theirs
这与使用合并工具不同,因为合并工具也会包含所有不冲突的差异数据块。我觉得这很让人分心。
提示二
有人已经提到了这一点,但是了解每个差异大块背后的意图通常对于了解冲突的来源以及如何处理它非常有帮助。
git log --merge -p <name of file>
这显示了在共同祖先和您要合并的两个头之间触及该文件的所有提交。 (因此它不包括合并之前两个分支中已经存在的提交。)这有助于您忽略明显不是当前冲突因素的差异大块。
提示三
使用自动化工具验证您的更改。
如果您有自动化测试,请运行它们。如果您有lint,请运行它。如果它是一个可构建的项目,那么在提交之前构建它,等等。在所有情况下,您都需要进行一些测试以确保您的更改不会破坏任何东西。 (哎呀,即使没有冲突的合并也会破坏工作代码。)
提示四
提前计划;与同事交流。
提前计划并了解其他人正在处理的工作有助于防止合并冲突和/或帮助更早地解决这些冲突——而细节仍然是新鲜的。
例如,如果您知道您和另一个人都在进行不同的重构,这些重构都会影响同一组文件,那么您应该提前相互交谈,并更好地了解各自的更改类型你们正在制作。如果您按顺序而不是并行进行计划更改,您可能会节省大量时间和精力。
对于涉及大量代码的重大重构,您应该强烈考虑按顺序工作:每个人都停止在代码的该区域工作,而一个人执行完整的重构。
如果您不能连续工作(可能是由于时间压力),那么就预期的合并冲突进行沟通至少可以帮助您在细节仍然清晰的同时更快地解决问题。例如,如果一个同事在一周内进行了一系列破坏性的提交,您可以选择在该周内每天一次或两次在该同事分支上合并/rebase。这样一来,如果您确实发现了合并/变基冲突,您可以更快地解决它们,而不是等待几周将所有内容合并到一个大块中。
提示五
如果您不确定合并,请不要强行合并。
合并可能会让人感到不知所措,尤其是当存在大量冲突文件且冲突标记覆盖数百行时。通常,在估算软件项目时,我们没有足够的时间来处理诸如处理复杂合并之类的开销项目,因此花几个小时剖析每个冲突感觉真的很累。
从长远来看,提前计划并了解其他人正在做什么是预测合并冲突并准备好在更短的时间内正确解决它们的最佳工具。