2017-06-23 30 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