【问题标题】:3-Way Merge in git - how comparing worksgit 中的 3-Way Merge - 比较的工作原理
【发布时间】:2017-11-27 04:27:24
【问题描述】:

我有三个版本的文件:

version 1       common ancestor      version  2
-------------   ---------------      ------------- 
before          original line        original line
original line                        after

在比较这些版本以生成最终合并版本时会发生什么?

我已经阅读了有关此主题的一些信息,但我仍然对它的工作原理感到困惑。

至于后面的例子:

比较版本之间的各个行是否是线性的? 如果是这样,那么最终的合并应该是这样的:

1 line: before
2 line: conflict (both left and right contributors are changed compared to ancestor) 

这是正确的理解还是工作方式不同?

【问题讨论】:

  • 您可以简单地尝试一下。创建一个存储库并使用包含一堆行的文件进行初始提交。做一个分支(或两个,如果你喜欢)。签出一个分支并修改文件以在上面添加一行,然后添加并提交。查看另一个分支(或主分支)并修改文件以在下面添加一行,然后添加并提交。然后让Git合并,观察结果。另见stackoverflow.com/q/44359334/1256452

标签: git merge git-merge branching-and-merging


【解决方案1】:

三路合并通常意味着不是只比较最终结果来执行合并,而是已经在查看公共基础版本。然后 Git 所做的是为每个版本创建 更改 的表示。

因此,相对于基本版本,它实际得到的结果如下:

version 1           version  2
-------------       -------------
+before              original line
 original line      +after

然后它将使用公共线作为上下文来对齐更改:

version 1           version  2
-------------       -------------
+before
 original line       original line
                    +after

此时,合并很容易解决,不会与以下内容发生冲突:

before
original line
after

请注意,此类合并仍可能导致冲突,因为 Git 可能没有足够的通用内容来正确对齐更改。尤其是对于非常小的文件,这可能会发生。

【讨论】:

    【解决方案2】:

    我不认为合并是通过在版本 1 和版本 2 之间“比较”单个行直接来完成的。它比这更复杂。这是关于尝试查看common-ancestor..version1common-ancestror..version2 之间的差异 可以“合并”的位置。在您的特定情况下,原始版本只有一行,对吗?我认为如果该行在 EOF 之前的末尾有一个 EOL,那么合并它们不会中断(因为该行将出现在两个最终版本中),因此它可以完美地合并.但是,如果该行 not 在末尾有 EOL,则版本 2 将删除该行(因为原始行不再存在....现在它是不同的行,因为EOL),然后你会以冲突告终。

    【讨论】:

    • 我刚刚测试了这两种方式,它就像我描述的那样工作。
    猜你喜欢
    • 2016-09-06
    • 2014-04-15
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多