此图中有 三个 有趣的变更集可以影响 (2) 合并:
-
Teal 变更集: 未显示,但看起来就在图表下方。这是 (2) 的第一个父项
-
蓝色变更集:从底部数第五个,标记为“修复测试”。这是 (2) 的第二个父项。
-
父母的共同祖先:也没有显示,将在下面进一步说明。奇怪的是,蓝绿色变更集看起来可能是共同祖先,但 Mercurial 现在允许您在正常情况下进行这种退化合并。
Mercurial 进行合并时,仅有三个重要的变更集:您合并的两个头及其共同祖先。在三路合并中,现在的逻辑是:
ancestor parent1 parent2 => merge
X X Y Y (clean)
X Y X Y (clean)
X Y Y Y (clean)
X Y Z W (conflict)
这样读取表格:“如果祖先是X,第一个父项也是X,第二个父项是Y,那么合并将包含Y”。换句话说:三路合并有利于改变,并且会让修改获胜。
你可以找到祖先
$ hg log -r "ancestor(p1(changeset-2), p2(changeset-2))"
changeset-2 是上面标有 (2) 的那个。当你说
在 (1) 提交的文件恢复到在 (2) 的先前状态,即使在合并中未提及这些文件。
那么重要的是要理解“合并”只是显示如何混合其他两个变更集的快照。 “在”合并中所做的更改是此快照与其 两个 父更改集之间的差异:
$ hg status --rev "p1(changeset-2):changeset-2"
$ hg status --rev "p2(changeset-2):changeset-2"
这显示了合并变更集分别与其第一个和第二个父项有何不同。我确信这些文件在其中一个列表中被提及——除非合并毕竟不是罪魁祸首。
当您检查三个变更集以及它们之间的差异时,您可能会发现有人必须解决冲突(上面合并表中的第四行)并在某个步骤中选择了错误的文件。