【问题标题】:Branch that includes non consecutive revisions包含非连续修订的分支
【发布时间】:2012-11-16 12:42:38
【问题描述】:

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

1
2
3
4

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

4
3
2  3
| /
|/
1    

【问题讨论】:

  • @Lazy Badger,你为什么从主分支中删除修订版 3?如果可能的话,我想把它放在那里。
  • 如果我的印象有误 - 我会改正的。主线将是 1-2-3-4,并且只有 3 个复制到新父级,是吗?
  • 是的。抱歉,如果最初不清楚。
  • 这种 案例中,术语“分支”大多没有意义,因为您想将一个变更集复制到某个新位置。答案将是一个命令变基hg rebase --keep -s 2 -d 0
  • 回复了问题以显示 OP 想要什么。

标签: mercurial branch branching-and-merging


【解决方案1】:

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

这会创建一个新的匿名分支,其中包含您想要的更改,并且还会从原始分支中删除第 3 版中的更改,而不会修改存储库的历史记录。

这会产生以下日志:

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

【讨论】:

  • @LazyBadger:我已经更新了我的答案......你能更详细地解释你的反对意见吗?我不明白您所说的“退出只是来自另一个故事”是什么意思。
  • 我无法在评论中显示 glog,但我测试了 - 你会得到另一棵树,而不是被 OP 请求重写:backout create additional commit
  • 虽然回退确实会创建一个额外的提交,但它不会创建另一个树。它只是创建一个新的提交来反转更改。结果是一样的。此外,这是唯一无需重写 repo 历史的方法(对于共享项目很重要)。
  • 不是退出,而是你的命令序列。您想查看命令集的完整输出吗?
  • 我会为您省力。示例中现在包含一个测试脚本和输出。
【解决方案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

【讨论】:

  • 绝对值得提出警告,如果你已经将这个 repo 推送到某个地方,那么重新设置基准为时已晚。
  • @Ry4an:阶段已过时此类警告
  • 大多数人仍然没有运行分阶段构建。我会留下警告。
  • 没那么简单!您不会显示 rev 3 的后代,但是当您变基时它们会随之移动。因此,您还必须将第 4 版重新设置为第 2 版。如果周围的历史是非线性的,则必须非常小心。
  • @alexis - 我完全 没有 rev 3 的后代。我复制粘贴真实回购的完整输出,无需编辑。如果历史更悠久 - 是的,这将是更长的舞蹈和 MQ 的更多机会
【解决方案3】:

从您的 cmets 看来,您正在尝试完成所谓的“挑选”:有选择地将一些变更集复制到另一个分支,而不将它们视为合并。如果那是正确的,您可以通过首先创建一个普通的修订分支,然后将要复制的变更集移植到它上面。命令 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 之间的关系。

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

【讨论】:

    猜你喜欢
    • 2013-04-06
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2016-04-13
    相关资源
    最近更新 更多