Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Mercurial中将线性历史拆分为两个分支_Mercurial - Fatal编程技术网

在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变更集不冲突。好吧,至少我希望如此

我有一个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变更集不冲突。好吧,至少我希望如此;)

不需要克隆,您可以在原始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:将工作目录标记为不同的分支视为更改。您可以进行空提交,以启动新分支。