0

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

1
2
3
4

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

4
3
2  3
| /
|/
1    
4

3 回答 3

3

如果您已经将此 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
于 2012-11-16T13:45:09.880 回答
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

在命名分支的情况下,您必须在第一次变基之前hg branch BRANCHNAMEhg ci -m "Creating branch"在变基中使用 -d 4 而不是 0

于 2012-11-16T13:46:18.737 回答
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 之间的关系。

没有办法选择性地导入一些变更集并将操作视为合并:合并总是统一完整的(线性)历史直到被合并的点。

于 2012-11-27T17:23:13.657 回答