2010-02-08 42 views
52

我想將變更集從一個分支移動到另一個分支。基本上,我目前有:如何將某些變更集移動到mercurial中的新分支

A -> B -> C -> D # default branch 

而且我想:

A # default branch 
\-> B -> C -> D # some_new_branch 

哪裏some_new_branch還不存在。我習慣了混帳,所以我猜想我有一種簡單的「mercurial」方式。

+2

這可能取決於你的意思是「分支」。 Mercurial有許多不同的分支策略,您應該嘗試熟悉一下:http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/ – user37078 2010-03-28 16:59:15

+1

類似的問題:[Mercurial move changes到一個新的分支](http://stackoverflow.com/q/4665549) – 2012-04-29 19:22:18

+1

[Mercurial移動更改爲新分支]的可能重複(http://stackoverflow.com/questions/4665549/mercurial-move-changes- – PhoneixS 2016-03-10 10:16:41

回答

67

一種方法是導出B,C,D的補丁;更新到A;科;應用補丁:

hg export -o patch B C D 
hg update A 
hg branch branchname 
hg import patch 

要刪除B,C,d從默認的分支,使用MQ擴展的strip命令。

+0

在一個項目中,我們決定不在下一個版本中包含一個功能,該功能已經成爲默認分支的一部分 - 我使用您的解決方案創建了一個新分支,其中包含與此功能相關的變更集。我沒有剝離變更集,而是將默認分支恢復到實施開始前的狀態。 – 2012-10-18 09:59:09

+0

這是爲了在那些被推到默認狀態之前,我假設? – NoBugs 2014-01-01 06:46:43

+0

是的,如果共享原始歷史記錄,任何對歷史的編輯都爲時已晚。你必須編輯歷史的所有副本,這可能不實際或不可行。 – 2014-01-01 18:04:23

7

與Mercurial隊列:

# mark revisions as draft in case they were already shared 
#hg phase --draft --force B:D 
# make changesets a patch queue commits 
# (patches are stored .hg/patches) 
hg qimport -r B:D 
# pop changesets from current branch 
hg qpop -a 
# 
hg branch some_new_branch 
# push changesets to new branch 
hg qpush -a 
# and make them commits 
hg qfinish -a 

沒有評論:

hg qimport -r B:D 
hg qpop -a 
hg branch some_new_branch 
hg qpush -a 
hg qfinish -a 
+1

第4行命令是 hg qpush -a – Shad 2014-01-13 00:41:44

+1

@Shad謝謝,修正。 – 2014-01-13 08:27:04

+0

如果例如它們已發佈在Bitbucket上(在其設置「>」更改集「中的web界面中),您仍然需要去除已移動的變更集。其他情況下,他們將進入分支,他們在第一次拉動後被移動。 – 2015-07-04 14:25:19

4

替代移植或補丁,你可以使用graft

hg update A 
hg branch branchname 
hg graft -D "B:D" 
hg strip B 

請注意,更改歷史記錄是不好的做法。只有在尚未推送時才應剝離。否則,您仍然可以退出您的更改。

+0

這很簡單,很棒,甚至可以使用像TortoiseHg這樣的GUI輕鬆完成。 – jahu 2016-06-03 10:43:45

相關問題