2010-06-30 109 views
12

有一種情況,我們故意將已命名分支(ABC)合併到我們的default分支中。Mercurial Undo合併

hg rollback不是一種選擇,因爲自那以後有過幾次提交。

有沒有辦法解決這個問題?

回答

4

如果您還沒有發佈回購公開,你能做到這一點

hg clone -r (parent1 of bad merge) -r (parent2 of bad merge) old new 

並刪除舊的回購。

+0

This Works ... thanks!現在我還有一個問題:如何在錯誤合併到新克隆的存儲庫後應用更改集? – 2010-06-30 14:28:53

+0

@Steve看到我的答案。你必須在老頭上「改造」它們。 – tghw 2010-06-30 14:29:37

+0

回退無法撤消合併。 – tghw 2010-06-30 14:31:19

8

您將需要Mq擴展名。如果您沒有打開,請將其添加到您的Mercurial.ini.hgrc文件中。

[extensions] 
hgext.mq= 

如果您不熟悉它,可以使用Mq extension來操縱歷史記錄。好消息是,這將使我們能夠修復您的回購。壞消息是,任何擁有複製的repo的克隆人都必須再次克隆它,因爲我們將改變歷史。

首先,讓你的repo的另一個克隆工作,所以我們不會搞砸任何東西。

現在,找到合併變更集(合併default和您的命名分支)的修訂版ID。寫下來。我們將其稱爲changesetM。現在找到下一個變更集的修訂ID。寫下來。我們將其稱爲changesetN

一旦你有了這兩個修訂版本的標識,你可以回到你的命令提示符和cd進入你的回購。然後輸入了以下內容,用適當的修訂ID替換changeset[M|N]

$ hg qimport -r changesetN:tip 
    # This will add all of your changes since the merge to the queue 
$ hg qpop -a 
    # This pops them all out of your history. 
$ hg strip changesetM 
    # This removes the merge changeset. 
$ hg update -C default 
    # Make sure we're on the default branch 
$ hg qpush -a 
    # Take the changesets in the queue and push them back onto your history. 
$ hg qfinish -a 
    # Remove changesets from the queue and finalize them as normal changesets. 

從本質上講,你是默認分支上衍合新的變更,刪除的過程中合併變更。完成後,您需要將更改推送到服務器上的新存儲庫,並讓您的同事克隆新副本。

最後,如果您有任何其他Mercurial問題,也可以查看kiln.stackexchange.com

UPDATE

我忘了說:如果有人基於東西,是隻有在其他分支的變化,有可能hg qpush -a將失敗。你會看到一個foo.txt.rejfoo.txt.orig文件鋪設。不幸的是,你必須自己解決這個問題。要解決此問題,請打開原始文件.orig文件和.rej文件,然後選擇合適的更改以將其保存在原始文件中。將它合併後,使用hg qrefresh將該修補程序更新到新的合併修補程序。從他們,你應該能夠再次運行hg qpush -a並繼續。如果您在另一個修補程序中再次遇到相同的錯誤,請按照相同的步驟進行操作。

+0

我和你在一起,直到hg qpush -a。我在控制檯中得到以下內容: 正在申請xxx.diff 修補文件----- 羣發#1失敗806 1個羣發失敗 - 保存拒絕「...」 補丁失敗,無法繼續 ... 申請過程中的錯誤,請修復並刷新310.diff – 2010-06-30 15:21:33

+0

請參閱我答案中的更新部分。 – tghw 2010-06-30 17:54:25

+0

這破壞了歷史,所以如果錯誤已經傳播,它將不起作用。請參閱:http://stackoverflow.com/questions/265944/backing-out-a-backwards-merge-on-mercurial – 2010-07-22 17:02:46

3

我遇到下面的情況下走到今天:

@ changeset: 1728:5d703e1051d3 
|\ parent:  1727:1a5f73b5edb4 
| | parent:  1720:65ddd0bde225 
| | user:  nn 
| | date:  Wed Feb 27 10:35:00 2013 +0100 
| | summary:  Merge with SomeBranch 
| | 
| o changeset: 1727:1a5f73b5edb4 
| | user:  nn 
| | date:  Wed Feb 27 10:34:30 2013 +0100 
| | summary:  lorem ipsum 
| | 
[some more changesets] 
| | 
o | changeset: 1720:65ddd0bde225 
| | branch:  SomeBranch 
| | user:  nn 
| | date:  Wed Feb 27 07:44:46 2013 +0100 
| | summary:  lorem ipsum 

SomeBranch不應該被合併到默認。我們做了什麼來解決這個問題,是使用backout命令與parent選項,如下所示:

hg backout --rev=1728 --parent=1727 

通過這個你不撤消合併本身:看一個分支圖(或者與圖形日誌或在TortoiseHg)你仍然會看到SomeBranch進入默認在r1728。然而,合併的結果被撤銷,這意味着包含退出(在我的情況下爲r1729)的變更集與r1727完全相同。

+0

這是否也照顧合併標誌? – elzapp 2017-11-17 15:16:54