Version control 为什么3路合并比2路合并更有优势?

Version control 为什么3路合并比2路合并更有优势?,version-control,merge,conflict,three-way-merge,Version Control,Merge,Conflict,Three Way Merge,表示三方合并比双向合并更不容易出错,而且通常不需要用户干预。为什么会这样 例如,三向合并成功而双向合并失败会有所帮助。三向合并,即应用一个基本文件的两个更改集时进行合并,而不是应用一个,然后将结果与另一个合并 例如,在同一位置添加一行的两次更改可以解释为两次添加,而不是一行的更改 比如说 文件a已经被两个人修改,一个添加了驼鹿,一个添加了鼠标 #File a dog cat #diff b, a dog +++ mouse cat #diff c, a

表示三方合并比双向合并更不容易出错,而且通常不需要用户干预。为什么会这样


例如,三向合并成功而双向合并失败会有所帮助。

三向合并,即应用一个基本文件的两个更改集时进行合并,而不是应用一个,然后将结果与另一个合并

例如,在同一位置添加一行的两次更改可以解释为两次添加,而不是一行的更改

比如说

文件a已经被两个人修改,一个添加了驼鹿,一个添加了鼠标

#File a
    dog
    cat

#diff b, a
    dog
+++ mouse
    cat

#diff c, a
    dog
+++ moose
    cat
现在,如果我们在应用变更集时合并变更集,我们将得到(三方合并)

但是如果我们应用b,那么看看从b到c的变化,它看起来就像我们只是把一个“u”变成了一个“o”(双向合并)


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

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

通过三向合并,它可以比较两个文件,但也可以将它们中的每一个与原始副本进行比较(在您更改之前)。因此,它可以看到您删除了第一行,而您的朋友添加了最后一行。它可以使用这些信息生成合并版本。

从Performce演示文稿中获得的信息很有趣:

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

  • 比较基本文件、源文件和目标文件
  • 确定源文件和目标文件中的“块”:
    • 与基础不匹配的块
    • 与基匹配的块
  • 然后,组合一个合并结果,包括:
    • 所有3个文件中相互匹配的块
    • 源或目标中与基不匹配但两者都不匹配的块
    • 与基不匹配但彼此匹配的块(即,它们在源和目标中的更改方式相同)
    • 冲突块的占位符,由用户解决
请注意,本图中的“块”纯粹是符号。每个都可以表示文件中的行,或层次结构中的节点,甚至可以表示目录中的文件。这完全取决于特定合并工具的功能

您可能会问,3路合并比2路合并有什么优势。实际上,没有双向合并,只有区分两个文件并允许您通过从一个文件或另一个文件中选取块来“合并”的工具。

只有三方合并才能让您知道区块是否是源代码的更改,以及更改是否冲突。


“是否更改冲突”-双向合并(diff)是否也会显示冲突(尽管冲突源的信息丢失)/但在Git中,如果基础不相同,则使用4向合并是很常见的。3路合并更好,2路合并更好。@Wernight,有5路合并吗?@Pacerier我不知道,但这就是git cherry pick或rebase过程中实际发生的情况。非常详细和有用的解释“但它如何知道如何处理差异?”没有理解。如果它已经可以看到两个文件之间的差异(不参考原始文件),为什么不能按文件时间戳的递增顺序连续应用这两个更改?也就是说:它从我朋友提交的副本开始,将其作为(新的)原件(在顶部添加行),然后在其顶部应用我的本地更改(在botton处删除行)。@Harry说原件有三行(ABC)。它从我朋友的副本(ABCD)开始,并将其与我的副本(BC)进行比较。在没有看到原始文件的情况下,它可能会认为我同时删除了A和D,最终结果应该是BC。@Harry如果每个文件都有一个自共同祖先以来的时间戳更改列表,那么您将有一个3路合并。您描述的方法需要将文件倒回公共祖先,以便按时间顺序应用差异。用不同的措辞,我不确定“两个文件之间的时间戳差异不涉及共同祖先”是否有明确的含义
#diff b and c, a
    dog
+++ mouse
+++ moose
    cat
    #diff b, c
    dog
--- mouse
+++ moose
    cat