2017-06-23 26 views
0

我有文件的三个版本:3路合并Git中 - 如何比较的作品

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) 

这是正确的认识或它的工作原理不同?

+1

你可以简单地尝试一下。创建一个存储库并使用包含一堆行的文件进行初始提交。做一个分支(或者如果你喜欢的话)。查看分支并修改文件以在上面添加一行,然后添加并提交。查看其他分支(或主分支)并修改该文件以在下面添加一行,然后添加并提交。然后让Git合并,并观察结果。另请参阅https://stackoverflow.com/q/44359334/1256452 – torek

回答

3

三向合并通常意味着,不是只比较最终结果来执行合并,而是已经在查看通用基础版本。 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 

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

2

我不认为合并是通过在版本1和版本2之间“比较”个别行直接完成的。它比这更涉及。这是关于试图看看common-ancestor..version1common-ancestror..version2之间的差异可以“合并”。在你的特定情况下,原始版本只有一行,对吗?我想认为,如果该行在EOF之前的末尾有一个EOL,那么合并它们将不会中断(因为该行将出现在两个最终版本中),因此它将完全合并。但是,如果线路没有而不是最后有一个EOL,那么版本2将删除该线路(因为原线路不再存在了......现在由于EOL,这是不同的线路),然后您最终会产生冲突。

+0

我刚刚测试了这两种方法,并且正如我所描述的那样工作。 – eftshift0