2011-12-11 56 views
4

兩個分支我有一個Mercurial庫的歷史,看起來像這樣:拆分線性的歷史成水銀

A -> B -> C -> N1 -> N2 -> N3 -> D -> E -> F 

而且我想將它轉變成以下病史:

A -> B -> C -> D -> E -> F 
      \_ N1 -> N2 -> N3 

鑑於我有一個克隆,它的歷史停在C處,最好的方法是什麼? D E F變更集與N1 N2 N3變更集不衝突。那麼,至少我希望如此;)

+0

看來你只需要衍合上的C頂部d,你甚至不需要克隆。一些GUI可能會讓你做到這一點。我不知道確切的命令,但MQ擴展名用於重新綁定,將DEF拆分爲隊列並將其粘貼回C. – 2011-12-11 21:36:00

+0

@herby我不認爲'rebase'命令將幫助shodanex完成任務,所以我不會用_rebasing_來描述解決方案。除此之外,我認爲「移植」更簡單,但「mq」同樣適用。 – Helgi

+0

我並不知道第二個項目:「有些情況下不允許重新定位過程: - 重新定位點(源)是目標的祖先 - 重新定位點(源)是目標的後代 「。 – 2011-12-11 22:08:14

回答

6

沒有必要有一個克隆,你可以在原來的回購工作。您可以將D,E和F移植到C的頂部,創建副本D1,E1和F1(如果沒有衝突的變化,它們將與原始文件相同)。你會有這樣的:

A -> B -> C -> N1 -> N2 -> N3 -> D -> E -> F 
      \_ D1 -> E1 -> F1 

然後你可以去掉原件。請參閱下面的腳本。

$ hg update C 
$ hg transplant D E F 
$ hg strip D 

你必須使兩個擴展:transplantmq。要做到這一點,這些行添加到您的hgrc

[extensions] 
transplant= 
mq= 

更新:由於水銀2.0,graft(內置命令)可以用來代替transplant這裏;如Laurens Holst suggests,應該工作得很好。

+0

@shodanex:我必須用我的腳本補充說,你最終會在同一個分支上有兩個頭。如果這是你想要的? – Helgi

+1

如果該分支是另一個分支,將會「移植」工作嗎?如果你在'hg up C'之後執行'hg branch foo'會怎麼樣? – zerkms

+0

@zerkms:如果你在'hg up C'之後執行'hg branch foo'和'hg commit',那麼這些變更集將會很好地移植到foo分支中。我可能應該在我的第一條評論中這樣說。:) – Helgi

2

您可以使用rebase此:

hg rebase --source D --dest C 

這可以作爲水銀2.0;此前,它曾經投訴到重新修訂祖先版本時,但他們刪除了該版本。

您必須啓用,如果您尚未:

[extensions] 
rebase =