2010-02-08 43 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

相关问题