假设我有一个没有像这样的分支的修订历史:
1
2
3
4
现在我想在我的存储库中创建一个带有修订版1
和的新分支3
,而不是修订版2
或4
。2
修订版/中没有冲突的更新3
。有没有办法做到这一点。我的最终存储库应该有两个这样的分支:
4
3
2 3
| /
|/
1
假设我有一个没有像这样的分支的修订历史:
1
2
3
4
现在我想在我的存储库中创建一个带有修订版1
和的新分支3
,而不是修订版2
或4
。2
修订版/中没有冲突的更新3
。有没有办法做到这一点。我的最终存储库应该有两个这样的分支:
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
因为你没有提到命名分支,所以我们使用匿名分支
前:
>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 branch BRANCHNAME
,hg ci -m "Creating branch"
在变基中使用 -d 4 而不是 0
从您的评论中,听起来您正在尝试完成所谓的“挑选”:有选择地将一些变更集复制到另一个分支,而不将它们视为合并。如果那是正确的,您可以通过首先创建一个普通的修订分支,然后将要复制的变更集移植到它上面。命令hggraft就是为此目的而设计的。
以下是它如何与命名分支一起工作,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 之间的关系。
没有办法选择性地导入一些变更集并将操作视为合并:合并总是统一完整的(线性)历史直到被合并的点。