如何将某个变更集移动到Mercurial的新分支中

59

我想将一个变更集从一个分支移动到另一个分支。基本上,我现在有:

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

我想要:

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

如果some_new_branch还不存在,我通常使用git,所以我猜我可能错过了一些简单的“mercurial”方法。


2
这可能取决于你对“分支”一词的理解。Mercurial有许多不同的分支策略,你应该尝试熟悉它们: http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/ - Dan
1
类似的问题:将改动移至新分支的Mercurial操作 - Oben Sonne
1
可能是Mercurial将更改移动到新分支的重复问题。 - PhoneixS
4个回答

70

一种方法是导出 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命令。


在项目中,我们决定不将一项已经包含在默认分支中的功能包含在下一个版本发布中 - 我使用了您的解决方案来创建一个包含与此功能相关的变更集的新分支。而不是剥离变更集,我将默认分支还原到实施开始之前的状态。 - Michael Schmeißer
这是针对那些还没有被推送到默认分支的情况,我猜测是吗? - NoBugs
是的,如果已经推送了原始历史记录,则任何对历史记录的编辑都为时已晚。您必须编辑所有副本的历史记录,这可能不切实际或不可能。 - Mark Tolonen
1
我可能曾经错误地使用了去除扩展名的方法,但当我尝试 hg strip B 时,我也失去了从导入的提交中新创建的分支信息,并且它们回到了默认分支。在创建新分支和导入之前进行剥离有所帮助。 - kerma
可以正常工作,谢谢!如果您需要对导出进行更多修订,最好使用以下语法:hg export -o patch -r B:D - quick

11

听起来有点像在git中进行挑选操作。 移植扩展 可能是你要寻找的。


8

使用Mercurial Queue:

# 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

如果移动的变更集已经在Bitbucket上发布(在其Web界面中的“设置”->“剥离变更集”),则仍然需要剥离它们。否则,在第一次拉取后,它们将进入分支。 - Vasiliy Toporov

8

除了移植或修补,您还可以使用graft来完成相同的操作。

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

注意,改变历史记录是不好的做法。只有在您尚未推送时才应进行剥离。否则,您仍然可以撤消您的更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接