为什么三向合并优于双向合并?

时间:2010-11-08 23:14:54

标签: version-control merge conflict three-way-merge

Wikipedia表示3向合并比2向合并更不容易出错,并且通常不需要用户干预。为什么会这样?

三向合并成功并且双向合并失败的示例将有所帮助。

5 个答案:

答案 0 :(得分:208)

假设您和您的朋友都签出了一个文件,并对其进行了一些更改。您在开头删除了一行,而您的朋友在最后添加了一行。然后他提交了他的文件,你需要将他的更改合并到你的副本中。

如果您正在进行双向合并(换句话说,差异),该工具可以比较这两个文件,并看到第一行和最后一行是不同的。但它怎么会知道如何处理差异呢?合并版本是否应包含第一行?它应该包括最后一行吗?

使用三向合并,它可以比较两个文件,但也可以将它们与原始副本进行比较(在您更改之前)。所以它可以看到你删除了第一行,并且你的朋友添加了最后一行。它可以使用该信息来生成合并版本。

答案 1 :(得分:65)

来自perforce演示的

This slide很有意思:

slide image

  

三向合并工具的基本逻辑很简单:

     
      
  • 比较基本文件,源文件和目标文件
  •   
  • 识别源文件和目标文件文件中的“块”:      
        
    • 与基础不匹配的块
    •   
    • 与基地相匹配的大块
    •   
  •   
  • 然后,汇总一个合并的结果,包括:      
        
    • 所有3个文件中彼此匹配的块
    •   
    • 与源或目标中的基础不匹配的块,但不在两者中
    •   
    • 与基数不匹配但彼此匹配的块(即它们在源和目标中的更改方式相同)
    •   
    • 冲突的块的占位符,由用户解决。
    •   
  •   
     

请注意,此插图中的“块”纯粹是象征性的。每个都可以表示文件中的行,或层次结构中的节点,甚至是目录中的文件。这完全取决于特定合并工具的功能。

     

您可能会问三向合并相对于双向合并有什么优势。实际上,没有双向合并这样的东西,只有工具可以区分两个文件并允许你通过从一个文件或另一个文件中挑选块来“合并”。   只有3方合并才能让您知道某个块是否是来自原点的更改以及更改是否发生冲突。

答案 2 :(得分:17)

我写了very detailed post about it。基本上你不能用双向,非常非常无效的方式跟踪删除/添加。

答案 3 :(得分:14)

三向合并,其中一个基本文件的两个变更集在应用时合并,而不是应用一个,然后将结果与另一个合并。

例如,在同一个地方添加一行的两个更改可以解释为两个添加,而不是一行的更改。

例如

文件a已被两个人修改过,一个添加了moose,一个添加了鼠标。

#File a
    dog
    cat

#diff b, a
    dog
+++ mouse
    cat

#diff c, a
    dog
+++ moose
    cat

现在,如果我们在应用变更集时合并变更集,我们将获得(3路合并)

#diff b and c, a
    dog
+++ mouse
+++ moose
    cat

但是如果我们应用b,那么看看从b到c的变化看起来我们只是将'u'改为'o'(双向合并)

    #diff b, c
    dog
--- mouse
+++ moose
    cat

答案 4 :(得分:0)

他们说“一张图画了一千个字”。

enter image description here

从 AWS CodeCommit 借用: 开发人员工具 > CodeCommit > 存储库 > 存储库名称 > 拉取请求 > 拉取请求名称 > 合并