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个文件中相互匹配的块
- 源或目标中与基不匹配但两者都不匹配的块
- 与基不匹配但彼此匹配的块(即,它们在源和目标中的更改方式相同)
- 冲突块的占位符,由用户解决李>
只有三方合并才能让您知道区块是否是源代码的更改,以及更改是否冲突。
“是否更改冲突”-双向合并(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