假设我有一个没有这样分支的修订历史记录:
1
2
3
4
现在,我想在我的存储库中使用修订版1
和3
创建一个新分支,但不是修订版2
或4
。版本2
/ 3
中没有相互冲突的更新。有没有办法做到这一点。我的最终存储库应该有两个这样的分支:
4
3
2 3
| /
|/
1
答案 0 :(得分:3)
如果您已将此回购发布到公共位置(或任何开发者已克隆您的回购),则可以使用graft
和backout
的组合执行此操作。
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 BRANCHNAME
和hg 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之间的关系。
无法选择性地导入某些变更集并将操作视为合并:合并始终将完整(线性)历史记录统一到合并点。