Mercurial 包含非连续修订的分支

Mercurial 包含非连续修订的分支,mercurial,branch,branching-and-merging,Mercurial,Branch,Branching And Merging,假设我有一个修订历史记录,没有如下分支: 1 2 3 4 4 3 2 3 | / |/ 1 现在,我想在我的存储库中创建一个新的分支,其修订版为1和3,而不是修订版2或4。修订版2/3中没有冲突的更新。有没有办法做到这一点。我的最终存储库应该有如下两个分支: 1 2 3 4 4 3 2 3 | / |/ 1 如果您已经将此repo发布到公共位置(或者任何开发人员已经克隆了您的repo),您可以通过组合使用graft和backout来完成此操作 graft命令将提交从一

假设我有一个修订历史记录,没有如下分支:

1
2
3
4
4
3
2  3
| /
|/
1    
现在,我想在我的存储库中创建一个新的分支,其修订版为
1
3
,而不是修订版
2
4
。修订版
2
/
3
中没有冲突的更新。有没有办法做到这一点。我的最终存储库应该有如下两个分支:

1
2
3
4
4
3
2  3
| /
|/
1    

如果您已经将此repo发布到公共位置(或者任何开发人员已经克隆了您的repo),您可以通过组合使用
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

如果您已经将此repo发布到公共位置(或者任何开发人员已经克隆了您的repo),您可以通过组合使用
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

因为您没有提到命名分支,所以我们使用匿名分支

之前:

>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

在命名分支的情况下,您必须
hg BRANCHNAME
hg ci-m“Creating branch”
在第一次重新基址之前,在重新基址中使用-d4而不是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 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

在命名分支的情况下,您必须
hg BRANCHNAME
hg ci-m“Creating branch”
在第一次重新基址之前,在重新基址中使用-d 4,而不是您的注释中的0

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

下面是它如何与命名分支
selective
一起工作。如果需要未命名的分支,只需省略分支创建

hg update -r 1
hg branch selective
hg graft -r 3
结果将如下所示(我希望这是您想要的):

默认情况下,嫁接将从源变更集中复制用户、日期和描述。新版本将具有与版本3相同的效果,但将具有新的数字和哈希id。Mercurial将不知道版本3和5之间的关系


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

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

下面是它如何与命名分支
selective
一起工作。如果需要未命名的分支,只需省略分支创建

hg update -r 1
hg branch selective
hg graft -r 3
结果将如下所示(我希望这是您想要的):

默认情况下,嫁接将从源变更集中复制用户、日期和描述。新版本将具有与版本3相同的效果,但将具有新的数字和哈希id。Mercurial将不知道版本3和5之间的关系


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

@Lazybager:我已更新了我的答案……您能更详细地解释您的反对意见吗?我不明白你所说的“回退只是来自另一个故事”是什么意思。我不能在评论中显示
glog
,但我测试了-你会得到另一棵树,而不是由OP请求重写:回退创建额外的提交虽然回退确实创建了额外的提交,但它不会创建另一棵树。它只是创建一个新的提交,该提交会反转更改。结果是一样的。此外,这是唯一一种不重写回购历史(对于共享项目很重要)的方法。不是回退,而是命令序列。是否要查看命令集的完整输出?我将为您省力。示例中现在包含了一个测试脚本和输出。@懒獾:我已经更新了我的答案……你能更详细地解释你的反对意见吗?我不明白你所说的“回退只是来自另一个故事”是什么意思。我不能在评论中显示
glog
,但我测试了-你会得到另一棵树,而不是由OP请求重写:回退创建额外的提交虽然回退确实创建了额外的提交,但它不会创建另一棵树。它只是创建一个新的提交,该提交会反转更改。结果是一样的。此外,这是唯一一种不重写回购历史(对于共享项目很重要)的方法。不是回退,而是命令序列。是否要查看命令集的完整输出?我将为您省力。示例中现在包含了一个测试脚本和输出。绝对值得在警告中添加