2010-11-11 67 views
48

我有兩個分支,默認和branch1。錯誤的是,我們團隊中的一個人將branch1與默認值合併。 branch1中的內容尚未準備好與默認合併(它包含對構建&部署環境的重大修改)。如何退出Mercurial的合併,然後再與該分支重新合併?

我們做了與「汞退出」的實驗中,打了退堂鼓合併(不知道這是做正確的方式)。然後,來自branch1的更改在默認情況下被刪除,這很好 - 但我們不能與branch1重新合併。

我們應該如何解決這個問題?

+0

有合併被推遲,現在公衆對很多人,或者你要包含的庫可控制列表的傷害? – 2010-11-11 08:21:11

+0

我不想說這個,但除非沒有人拉,否則你不能。 – 2010-11-11 08:32:13

+0

不幸的是,合併被推送到公共存儲庫,並且在我們有任何改變恢復它之前,有幾個人將其合併。 – 2010-11-11 10:01:50

回答

84

在這裏有很多你可能想要這樣做的場景,我會讓每個場景成爲標題,這樣你就可以找到適合你的案例。請注意,我仍然在學習Mercurial,如果我說的內容錯誤,使用錯誤的術語,可能會做得更好等,我會喜歡指針。

沒有進一步更改,合併不共享(無推/拉)

程序員已經合併,但沒有做任何東西,也沒有他(她)分享與任何人的變化,以任何方式

在這種情況下,簡單地丟棄本地克隆,並獲得來自安全存儲庫的新鮮克隆。

對合並的頂部局部變化,而不是共享

程序員已經合併,並持續工作基礎上合併。合併後的變更集應該保留,但合併本身應該被刪除。這些變化(合併+以下的變更)尚未與任何人

在這種情況下共享我會做的四位一體:

  1. 嘗試使用REBASE擴展,這將變更集從一個位置移動到另一個。如果更改集基於合併中引入的代碼更改,則必須執行一些手動工作來調和差異。
  2. 嘗試使用MQ擴展來將要保留的變更集拉入修補程序隊列,然後將它們推回到其他位置。然而,這與REBASE擴展在基於合併的變化方面存在相同的問題
  3. 嘗試使用TRANSPLANT擴展名將更改從一個位置「複製」到另一個位置。仍然存在與前兩個​​相同的問題。
  4. 再次進行這項工作,可能需要藉助差異工具對我想丟棄的變更集進行更改,然後在正確的位置重新執行。

爲了擺脫合併變更+以下所有變更集,有一對夫婦的選擇:

  1. 使用的MQ擴展條命令

    hg strip <hash of merge changeset> 
    
  2. 克隆和拉,並指定導致的變更集的散列,但不包括合併。實質上,通過從受損克隆中提取一個新克隆來創建一個新克隆,並避免引入您不想要的合併。

    hg clone damaged -r <hash of first parent> . 
    hg pull damaged -r <hash of second parent> 
    

合併推給別人,在克隆

控制程序員已經被推到主存儲庫,或給別人,或者有人從程序員倉庫拉。但是,你(作爲該組的開發人員)有超過所有的倉庫控制,如,你可以聯繫和更多的工作完成之前跟大家

在這種情況下,我會看到如果步驟1或2可以完成,但可能需要在很多地方完成,所以這可能涉及很多工作。

如果沒有人根據合併變更集完成工作,我將使用步驟1或2進行清理,然後推送到主存儲庫,並要求每個人從主存儲庫獲取新的克隆。

合併推,你不必在克隆

程序員控制推mergeset,你不知道誰將會擁有合併變更。換句話說,如果您成功地從存儲庫中根除這個存儲庫,那麼仍然存在的某個人的流失將會將其還原。

忽略合併變更集並在兩個分支中工作,就好像它從未發生過一樣。這將留下一個懸而未決的頭。之後你可以在合併這兩個分支的時候,爲這個頭部做一個空歸併來擺脫它。

M   <-- this is the one you want to disregard 
/\ 
* * 
| | 
* * 
| | 

只要繼續在兩個分支的工作:

| | 
* * 
| M |  <-- this is the one you want to disregard 
|/ \| 
* * 
| | 
* * 
| | 

再後來,你將二者合併,真正的合併,你想:

m 
/\ 
* * 
| | 
* * 
| M |  <-- this is the one you want to disregard 
|/ \| 
* * 
| | 
* * 
| | 

然後,您可以做一個空合併擺脫搖搖欲墜的頭。不幸的是,除了通過TortoiseHg,我不知道該怎麼做。它有一個複選框,我可以放棄其中一個分支的更改。

隨着TortoiseHg,我會更新到我想保留的合併(最頂端,小寫m),然後選擇並右鍵單擊下面的懸空合併頭,然後檢查「放棄合併目標的所有更改其他)修訂版「: discard changes from target

+7

你的HG fu很強大..除了非徒手圈(因此+1)外,你還有ascii圖表,但圖表和圈子與此無關:) – 2010-11-11 09:06:55

+1

我希望我可以投多一些次.... – 2011-01-05 20:53:30

+4

正如在[問題#7476481](http://stackoverflow.com/a/7476481/439790)的[答案#439790]中提到的,放棄更改期間的方法是:'hg merge 4 --tool internal:local' – zigarn 2014-02-21 10:18:32

0

你不能真正退出一個合併很好。國際海事組織,處理這個問題的最好方法就是放棄合併,並在合併之前繼續進行一系列變革,留下一個懸而未決的頭(可以剝離)。如果自合併後發生其他變化,則可將其重新裝上新的「好」頭。

0

這個答案假定您已經被推

這將導致(至少一個)懸而未決的頭,這取決於你忘記了。更多取決於誰從哪個分支推出。

我愛HG和如飢似渴地使用它,但是當它的歷史是(設計)故意一成不變加上自己的一個分支的想法可以駕駛人發瘋。

我通常克隆之前做一個分支合併,因爲這個原因回購的備份(本地)。我總是在拉之前檢查。

Eric Raymond is working on something或多或少與DVCS無關,可以(希望)像你描述的oops一樣幫助你,但是我不認爲他將在一兩週內完全實現HG支持。不過,這可能值得一看。

但是,只有在沒有人拉動'ooopsie'的提示時纔有用。

0

感謝大家的好評!由於我們急於解決問題,而且我們的團隊對Mercurial來說相對較新,所以我們採用了非常實用的解決方案。

在我們的存儲庫服務器上,我們創建了一個新的存儲庫,然後我們克隆了舊的存儲庫,直到合併之前的修訂版本。然後將新克隆推送到服務器,並將新鏈接發送給每個人。幸運的是,我們是一個相當小的開發團隊。

也許不是最溺愛的方式來解決問題,但它的工作:)

+0

這不應該被標記爲答案,Lasse V. Karlsen的迴應應該是。 – EtienneT 2012-06-22 14:04:27

+0

這不是我們當時如何解決它,但我同意。 Lasses解決方案是正確的。 – 2012-07-07 08:23:26

0

我有這個確切的問題。一位同事意外地將我的分支合併到默認分支中,但仍然不完整。最初我只是退出合併,似乎工作正常,直到我想合併我的分支默認保持。我需要的文件在合併時被標記爲刪除。

解決方案是一直回到我原來的背部,這解決了我的同事的錯誤,並退出了退出。這樣可以阻止文件被標記爲已刪除,並讓我成功地將我的分支合併到默認設置中。

2

我們做了一個'hg backout'的實驗,支持合併(不確定這是否正確)。然後,來自branch1的更改在默認情況下被刪除,這很好 - 但我們不能與branch1重新合併。

我使用退出合併取消。你不能重新合併,但你可以「退出退出合併」,即當你想重新合併時,你可以在「退出合併變更集」提交'hg退出',然後再次合併分支。

例子:

7  M  remerge 
    6 / \ 
    5 * |  hg backout 3 (backout backout) 
    4 | *  fix error 
    3 * |  hg backout 2 
    2 M |  fail merge 
    / \ 
    1 *  * 
    |  | 
+0

這看起來很有前途。正是我需要的!我會測試它。 – 2017-03-10 10:14:47