2011-12-11 58 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 =