Mercurial:我能重命名一个分支吗?

213
我们现在有一个“stiging”分支,但“staging”似乎更符合语义。如何处理这个问题是一个好的策略?
5个回答

228

更新到 stiging 分支并从它创建一个新分支。然后关闭旧分支。

总之:

hg update stiging
hg branch staging
hg commit -m"Changing stiging branch to staging."
hg update stiging
hg commit --close-branch -m"This was a typo; use staging instead."
hg push --new-branch

2
Mercurial允许重用已关闭的分支名称吗?也就是说,如果您有一个v3分支,您是否可以使用上述技术将其重命名为v4,然后即使留下了已关闭的v3,也可以派生出一个新的v3分支? - Joshua Goldberg
1
不,分支是永久的。如果你提交到一个关闭的分支,Mercurial会重新打开它。如果你想要像Git一样的“轻量级”分支,请使用书签。 - Elliot Cameron
4
@JoshuaGoldberg,3noch是错误的。如果你使用--force,Mercurial 允许您重复使用已关闭的分支名称。例如:hg branch --force v3。这将导致 hg update v3 更新到新的 v3 分支,就像您想要的那样。 - Gili
2
通过使用 hg help branch 命令并添加 "--force" 参数,可以确认 @Gili 的评论:即使存在同名分支也可强制设置分支名称。 - Joshua Goldberg
8
如果在分支之前关闭 stiging,就不会出现“悬空”的末端。 - Habizzle
显示剩余2条评论

64

针对未来的读者:使用 rebase 扩展,您可以创建一个与 stiging 相同父级的新分支,并将整个分支历史记录移动到该分支中,如下所示:

hg update -r "parents(min(branch('stiging')))"
hg branch staging
hg commit
hg rebase --source "min(branch('stiging'))" --dest staging

这假设stiging只有一个父节点。当然,你也可以直接使用明确的修订版本号。
注意1:如果分支stiging包括与其他分支的合并,则我认为只要stagingstiging具有相同的父节点,它们就会保留这些合并。但我肯定会再次核实。
注意2:由于这样会编辑历史记录,旧分支不会从克隆的存储库中消失(请参阅rebase文档)。除非每个人都能重新克隆,否则对于大型团队来说可能不是一个非常实际的解决方案。
注意3/编辑(由@JasonRCoombs提供):现在phases在Mercurial中已成为标准,rebase将拒绝修改已经推送的变更集。要么通过更改阶段回到草稿状态(使用hg phases),要么让旧分支保持原样,并创建一个正确命名的副本(例如,使用`hg rebase --keep')。

对于小团队来说,强制用户克隆代码库或使用hg convert是个好主意。 - hochl
5
使用较新的Mercurial版本时,如果要移动的更改是“公共的”,则重新整理命令将失败并显示“无法重新整理不可变更集”。可以使用hg phases将其强制转换为草稿状态,或在运行重新整理命令时传递--keep选项,这将复制而不是移动这些更改。 - Jason R. Coombs
在第4步:abort: can't rebase immutable changeset 11b1e2b7dc4f。请注意,我已经将另一个分支的变更集嫁接到了这个分支中。除此之外,它没有分裂和合并。 - Mark Jeronimus
@Mark,请看上面的第三条注释。 - alexis
7
不需要在新分支上提交更改集并执行变基,你可以省略这一步骤,使用 . 作为 --dest 参数值,变基将自动采用新分支名称。 - weberc2

16
创建一个名为“staging”的新分支,忽略其他分支...

+1,这就是我会做的。旧的变更集仍将具有旧的分支名称,但新的变更集将具有新的分支名称。 - barjak

16
如果您在其中有更改集,则必须使用带有分支映射的转换扩展来重命名它。然后,每个人都必须克隆新存储库或删除旧分支。

2
这是一个有趣的解决方案,你能再详细说明一下吗? - DrM

8

这会修改历史记录,仅适用于高级Mercurial用户。如果您不知道这意味着什么,请不要这样做。

如果stiging仅为本地,则可以通过graftstrip的组合将其更改为staging。首先更新到stiging分叉的祖先变更集。创建staging分支并将每个提交从stiging移植到staging。现在,Staging应该是stiging的副本。最后,通过删除其第一个提交来销毁stiging。

hg update {SHA-1 of the ancestor changeset}
hg branch staging
hg graft {first changeset in stiging} ... {stiging head-1} {stiging head}
hg strip {first changeset in stiging}
hg push --new-branch

1
对于第三步,您可以使用hg graft {stiging中的第一个变更集}..{stiging head} - KCD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接