在Mercurial中将线性历史拆分为两个分支
我有一个mercurial存储库历史记录,如下所示:在Mercurial中将线性历史拆分为两个分支,mercurial,Mercurial,我有一个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变更集不冲突。好吧,至少我希望如此
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变更集不冲突。好吧,至少我希望如此;) 不需要克隆,您可以在原始repo中工作。您可以将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
您必须启用两个扩展:transplant
和mq
。为此,请将这些行添加到您的hgrc
:
[extensions]
transplant=
mq=
更新:从Mercurial 2.0开始,这里可以使用
graft
(内置命令)代替transplant
;正如劳伦斯·霍尔斯特(Laurens Holst)所说,rebase应该同样有效。您可以使用rebase
来实现这一点:
hg rebase --source D --dest C
从Mercurial 2.0开始,它就可以工作;以前,当重新调整到祖先版本时,它会抱怨,但他们将其删除了
如果尚未启用,则必须启用:
[extensions]
rebase =
看起来你只需要在C上加上D,你甚至不需要克隆。一些GUI可能允许您这样做。我不知道确切的命令,但MQ扩展用于重定基址,将D-E-F拆分为队列并将其粘贴回C。@herby我认为
rebase
命令不会帮助shodanex完成任务,因此我不会使用重定基址这个词来描述解决方案。除此之外,我认为移植
更简单,但mq
也同样有效。我不知道“有些情况下不允许重定基址:-重定基址(源)是目标的祖先-重定基址(源)是目标的后代”中的第二项.Rebase应该可以正常工作,上面提到的@herby限制不再适用。Rebase不使用MQ或修补程序,它使用了一种称为null merges(afaik)的方法。@shodanex:我必须在我的脚本中添加这一点,您最终会在同一个分支上有两个头。如果这是你想要的?如果分支是另一个分支,移植
会起作用吗?如果您在hg-up C
之后立即执行hg-branch-foo
,该怎么办?@zerkms:如果在hg-branch-foo
之后执行hg-commit
,则更改集将被完美地移植到分支-foo中。我可能应该在我的第一次评论中这样说。:)奇怪的是,在hg
中不能进行空提交(就像在git
中可以做的那样),因此您需要真正地更改某些内容(不方便,但无论如何,我想在hg
)中甚至可以以这种方式修改历史记录@zerkms:将工作目录标记为不同的分支视为更改。您可以进行空提交,以启动新分支。