2010-07-09 92 views
8

Mercurial總是使用外部合併工具,當合並的兩個分支對同一文件有更改時?Mercurial和合並工具?

或者首先看它是否可以合併文件本身,並且只有在外部工具無法合併的情況下才能進行合併?

的原因,我問的是,我(再次)重新讀取tutorial written by Joel Spolsky on Mercurial一件事,他說,比較顛覆和Mercurial如何合併的時候是:

相比之下,而我們在Mercurial分開工作,Mercurial正在忙於保存一系列變更集。所以,當我們想要將我們的代碼合併在一起時,Mercurial實際上擁有更多的信息:它知道我們每個人都改變了什麼,並且可以重新應用這些改變,而不僅僅是看最終產品,並試圖猜測如何把它們一起。

只是,我的經驗告訴我,當兩個分支對同一個文件進行更改時,似乎涉及外部合併工具。因此,這不會導致上述觀點不正確嗎?

或者我應該解釋爲如下:

  • 顛覆僅合併這兩個分支的最終狀態,並有更多的工作在一個單元
  • 水銀合併每個單獨變更,這使得做它與更小的變化單位一起工作,合併成功的可能性更高

有人可以對此有所瞭解嗎?


編輯:我舉一個例子:

@echo off 

setlocal 

if exist repo rd /s /q repo 

md repo 
cd repo 
hg init . 

rem --- version 0 --- 
echo 1 >test.txt 
echo 2 >>test.txt 
echo 3 >>test.txt 
echo 4 >>test.txt 
echo 5 >>test.txt 
hg add test.txt 
hg commit -m "v0" 

rem --- version 1 --- 
echo 1 >test.txt 
echo 2 v1 >>test.txt 
echo 3 >>test.txt 
echo 4 >>test.txt 
echo 5 >>test.txt 
hg commit -m "v1" 

rem --- version 2 --- 
hg update 0 
echo 1 >test.txt 
echo 2 >>test.txt 
echo 3 >>test.txt 
echo 4 v2 >>test.txt 
echo 5 >>test.txt 
hg commit -m "v2" 

rem --- merge --- 
hg update 1 
hg merge 2 

這首先創建具有下列內容的文件:

1 
2 
3 
4 
5 

然後它更改爲:

1 
2 v1 
3 
4 
5 

然後,它返回到初始版本(變更),它改變爲:

1 
2 
3 
4 v2 
5 

然後,它試圖將二者合併。

現在,根據(當前)單個答案,這應該不會造成問題,因爲這些更改沒有衝突。

但是,在這一點上,Beyond Compare(我的外部合併工具)被調用。

回答

3

只有在需要解決衝突的情況下,纔會調用mergetool。對不同分支中相同文件的更改構成了這種衝突。

除此之外,實際的合併算法不基於變更集,它基於文件以允許最佳合併結果。有關更多詳細信息,請參閱Mercurial Wiki

Mercurial使您的合併不成功,因此您有機會在合併變更集之前檢查您的代碼。

+0

請看我編輯的問題 – 2010-07-09 19:50:05

+0

對不起,我在編輯,你也是。現在應該更清楚了。 mergetool調用的標準是對同一個文件的更改,這是非常合理的。 – 2010-07-09 19:54:15

6

mercurial merge和svn merge的最大區別在於mercurial merge算法可以訪問被合併的兩個版本之間的最後一個共同祖先。如果你的歷史看起來像

A--B 
\-C 

SVN會變成你的合併工具失去對B和C.水銀將推出與A,B和C的工具和一些工具,做的更好的東西這一點。

在使用A,B和C自己做出一些明顯的選擇之前,Mercurial會在啓動工具之前進行自己的內部合併。您可以通過更改工具的premerge設置來關閉該功能。

由於您將2與自己的祖先合併,所以您的測試沒有給出好的結果。相反,如果你在創建變更2之前做hg update 0,讓你有一個實際的分支歷史是這樣的:

@ changeset: 2:790856e061f4 
| tag:   tip 
| parent:  0:bfba1d8f77af 
| user:  Ry4an Brase 
| date:  Fri Jul 09 16:50:34 2010 -0500 
| summary:  added v2 
| 
| @ changeset: 1:7a9c581561b6 
|/ user:  Ry4an Brase 
| date:  Fri Jul 09 16:50:16 2010 -0500 
| summary:  added v1 
| 
o changeset: 0:bfba1d8f77af 
    user:  Ry4an Brase 
    date:  Fri Jul 09 16:49:29 2010 -0500 
    summary:  first 

然後當你你會得到hg merge

1 
2 v1 
3 
4 v2 
5 

沒有你的合併工具啓動。