2011-02-09 35 views
16

舉一個簡單的例子:我在默認分支上工作,在本地提交了一些變更集,並且我從主存儲庫中提取了一些變更集。我已經在隔離的本地存儲庫中工作了幾天,因此在將我的結果推送回主服務器之前,需要進行一些合併更改。在Mercurial中合併方向問題嗎?

default ---o-o-o-o-o-o-o-o-o-o-o (pulled stuff) 
      \ 
      o----o------------o (my stuff) 

我現在可以做兩件事。

選項#1:

hg pull 
hg merge 

結果#1:

default ---o-o-o-o-o-o-o-o-o-o-o 
      \     \ 
      o----o------------o-O 

選項#2:

hg pull 
hg update 
hg merge 

結果#2:

default ---o-o-o-o-o-o-o-o-o-o-o-O 
      \     /
      o----o------------o 

這兩個結果看起來同構於我,但在實踐中,似乎選項#2導致較小的變更集(因爲它只對主線應用我的少量更改,而不是將所有主線更改應用於我的幾個)。

我的問題是:這有什麼關係嗎?我應該關心我合併的方向嗎?如果我這樣做,我可以節省空間嗎? (合併之後做hg log --patch --rev tip建議如此。)

回答

14

它們(有效)是相同的。您看到hg log --patch --rev X輸出大小有所不同,因爲日誌顯示結果和(任意)其「左」父級(正式爲p1)的差異,但這不是它的存儲方式(Mercurial具有不是補丁的二進制比較存儲格式/差異爲基礎),現在它是如何計算的(p1,p2和最近最常見的祖先都被使用)。

唯一真正的區別是,如果您使用的是命名分支,分支名稱將是左父分支的名稱。

2

如果您正在使用書籤,也有區別。在進行合併時,您所在的分支是接收更改的分支,因此新的更改集將成爲該分支的一部分。 Supose你有這樣的情況:

default ---o-o-o-o-o-o-o-o-o-o-o -- Head: Rev 200 
      \ 
      o----o------------o -- Head: Rev 195, Bookmark: my-stuff 

如果合併修訂版200到195版本,書籤my-stuff將移動到啓201,因爲你是在生成具有書籤同一分支新的變更。

另一方面,如果您將195合併到200中,您正在分支中生成沒有書籤的變更集。該my-stuff書籤將保持在啓195

+1

如果你正在使用[汞的Git(http://hg-git.github.com/)這一點尤爲重要,因爲跟蹤虛擬的Git分支的位置使用書籤。如果你以錯誤的方式合併,Git分支書籤不會移動,並且你無法推送任何東西。 – 2012-04-23 16:55:08