2010-10-02 10 views
32

我正在開發一個項目,我有一個提交功能,該功能引入了一個沒有立即發現的主要問題的功能。現在我想完全刪除該修訂版,同時保留其後的工作,但是我很難在這種3路合併的基礎上進行包裝。這是我的項目的簡化圖。Mercurial/Meld中的3路融合是如何工作的?

 
o changeset: 134:7f81764aa03a 
| tag:   tip 
| parent:  128:451d8a19edea 
| summary:  Backed out changeset 451d8a19edea 
| 
| @ changeset: 133:5eefa40e2a29 
| | summary:  (Change I need to keep keep) 
| | 
*snip 3 commits* 
| o changeset: 129:5f6182a97d40 
|/ summary:  (Change I need to keep keep) 
| 
o changeset: 128:451d8a19edea 
| summary:  (Change that introduced a major problem) 
| 
o changeset: 127:4f26dc55455d 
| summary:  (summary doesn't matter for this question) 

如果我理解正確,r127和r134是完全一樣的。當我hg up -C -r 133然後運行hg merge時,Meld彈出三種形式的文件:本地文件,基本文件和其他文件。當地似乎是r133,但我很難在「基地」和「其他」的意義上包圍我的頭。

回答

34

本地是R133

其他是R134

基地是R128(共同的祖先既R133和R 134)

當您執行3的方式進行合併將所有這三者進行比較,以幫助您決定採取何種措施。通過查看其他修訂版本中的變化以及共同祖先看起來如何,您可以就保留什麼和更改哪些內容做出更明智的決定。

+0

所以你說這很多是手動合併? – Pacerier 2015-03-25 16:14:51

10

你的問題確實令人困惑,但這裏有一些信息可能對你有幫助。

  • 什麼是基數?

Base是您目前檢出並處理的未修改版本。其他可能發生的變化已分叉(您可以在當前的本地和基地之間進行修訂!)。它只是其中最近的修訂版,其中沒有其他叉已轉移後(同一父)(在你的情況r128)

  • 什麼是頭?

Head是版本控制的最新版本。如果你只在一個副本上工作,它可能是基地。但同事可能修改了相同的文件並將其檢入版本控制,然後head比base更晚。

  • 什麼是本地?

地方是你修改後的版本(你的情況R133)

  • 什麼是其他?

另一種是一些叉/分支,也有你的基地爲母(在你的情況下,R134)

  • 如何3路合併工作?

3層合併工作(至少在合併)分層次。通常由左到右是這樣的:

本地>數據庫>其它/頭

本地/基地主要是微不足道的,因爲它已修改正是

,那麼你可以將更改合併到頭部修訂或你的同事或其他人之一。

可以有多個其他/頭部修訂,但這不是你的工作合併,因此超過3種方式比較沒有意義。

+12

您對頭部的定義對於mercurial來說是不準確的。 mercurial的最新版本被稱爲'tip'。尖端總是一個頭,但頭並不總是一個尖端。在合併中,「頭」從來就不是「基礎」,因爲基礎是兩個正在合併的變更集的最近共同祖先。 – 2010-10-02 18:28:52