包含非连续修订的分支

时间:2012-11-16 12:42:38

标签: mercurial branch branching-and-merging

假设我有一个没有这样分支的修订历史记录:

1
2
3
4

现在,我想在我的存储库中使用修订版13创建一个新分支,但不是修订版24。版本2 / 3中没有相互冲突的更新。有没有办法做到这一点。我的最终存储库应该有两个这样的分支:

4
3
2  3
| /
|/
1    

3 个答案:

答案 0 :(得分:3)

如果您已将此回购发布到公共位置(或任何开发者已克隆您的回购),则可以使用graftbackout的组合执行此操作。

graft命令会将提交从一个分支复制到另一个分支。 backout命令将反转先前提交所做的更改。

以下示例应该复制您的情况:

hg init test
echo test>>test\test.txt && hg -R test ci -Am "baseline"
echo test>>test\test.txt && hg -R test ci -Am "changeset 1"
echo test>>test\test.txt && hg -R test ci -Am "changeset 2"
echo new>>test\new.txt   && hg -R test ci -Am "changeset 3"
echo test>>test\test.txt && hg -R test ci -Am "changeset 4"
hg -R test backout -r 3
hg -R test ci -m "backed out changeset 3"
hg -R test update -r 1
hg -R test graft -r 3
hg -R test glog --template "{desc}\n"

这将创建一个包含所需更改的新匿名分支,并在不修改存储库历史记录的情况下从原始分支中删除rev 3中的更改。

这会产生以下日志:

@  changeset 3
|
| o  backed out changeset 3
| |
| o  changeset 4
| |
| o  changeset 3
| |
| o  changeset 2
|/
o  changeset 1
|
o  baseline

答案 1 :(得分:2)

因为您对命名分支一无所知,我们使用匿名分支

在:

>hg glog --template "{rev}:{desc}\n"
@  3:Added d.txt
|
o  2:Added c.txt
|
o  1:Added b.txt
|
o  0:Initial commit

>hg rebase -s 2 -d 0

>hg glog --template "{rev}:{desc}\n"

@  3:Added d.txt
|
o  2:Added c.txt
|
| o  1:Added b.txt
|/
o  0:Initial commit

>hg rebase -s 3 -d 1

>hg glog --template "{rev}:{desc}\n"
@  3:Added c.txt
|
| o  2:Added d.txt
| |
o |  1:Added b.txt
|/
o  0:Initial commit

如果是命名分支,则必须在第一次rebase之前使用hg branch BRANCHNAMEhg ci -m "Creating branch",在rebase中使用-d 4而不是0

答案 2 :(得分:0)

从你的评论中,听起来你正试图完成所谓的“樱桃挑剔”:有选择地复制一些变更集到另一个分支,而不将它们视为合并。如果这是正确的,您可以通过首先从修订版1创建普通分支,然后将要复制的更改集移植到其上来实现。命令 hg graft 就是为此目的而设计的。

以下是命名分支selective的工作原理。如果您想要未命名的分支,只需省略分支创建。

hg update -r 1
hg branch selective
hg graft -r 3

结果将如下所示(我希望,这是你想要的):

4
|
3
|  5 = 3
2 /
|/
1
|
0

默认情况下,graft会从源变更集复制用户,日期和说明。新版本将与版本3具有相同的效果,但将具有新的数字和哈希ID。 Mercurial不会意识到修订版3和版本5之间的关系。

无法选择性地导入某些变更集并将操作视为合并:合并始终将完整(线性)历史记录统一到合并点。