Mercurial:如何创建一个非计划分支

3
我的使用情况是这样的:我正在开发一个新功能,对此有多次提交。由于它只是一个小功能,所以我甚至没有考虑在功能分支上完成此功能。
然而,现在我的老板要求我在同一分支(默认分支)上修复一个错误。
为了解决这个问题,我想为我的功能创建一个分支,将所有现有的(未推送的)提交推到该分支上。
因此,我想在我的第一个提交之前创建一个分支,然后将所有提交移动到该分支中。
我该如何做?
3个回答

3
针对这种情况,您可以通过变基来解决(可能需要在您的配置中启用该功能)。
在您的分支上,更新到您想要移动的变更集之前的版本:
hg up -r<revison>

假设需要移动连续的修订版本。
创建一个新分支:
hg branch "TempWork"

将虚拟提交放到上面以便得到一个新版本:
hg commit -m"New Branch"

然后,从您想要移动的变更集中的第一个执行变基操作(它会自动移动后代),并将新分支修订版本指定为目标:

hg rebase -s<base revision> -d<new branch revision>

然后将更新合并到您的主干分支。


啊,你说得对,我应该更仔细地阅读他已经提交了的修改。 - K Z
1
本答案描述了如何将您的更改重新基于一个新的命名分支。我认为这很丑陋;rebase是一种修改历史记录的操作,而命名分支通常不用于临时分支(正是因为它们需要事先设置,不能在不修改历史记录的情况下后期添加)。最好和简单的方法是使用匿名分支或克隆,可选地与书签结合使用。 - Laurens Holst
@LaurensHolst Rebase 是一种常用且被广泛接受的机制。如果更改是本地的,它可以完美地工作。 - Adam Houldsworth
@LasseL 实际上,如果你可以无问题地使用匿名分支,你只需通过hg update -r切换到之前的修订版本,并继续在代码的新“分叉”上工作,就像Laurens建议的那样。 - Adam Houldsworth
我只赞成了你的解决方案。如果有办法,我将接受你和劳伦斯的解决方案 :) - Lasse L
显示剩余3条评论

3

根据个人偏好,有两种方法可以采用:

  1. 在新的存储库中。

    克隆您的存储库并进行所需的错误修复。完成后将其推送到主存储库,并在原始存储库中继续工作。像往常一样拉取和合并获取新更改。

  2. 在现有存储库中。

    更新到本地更改之前的变更集,然后开始修复和提交。这将创建一个新的匿名分支。完成后使用 push -r . 推送,这将只推送包含在工作副本中的更改。之后,与原始分支合并 (hg merge) 并继续进行工作。

    请注意,如果您不舒服于离开未标记的更改,可以使用 hg bookmark 将功能分支加为书签。此外,您可以轻松使用 hg heads 找回任何留下的头。

个人建议在新克隆中进行工作,因为您不必担心分支和未提交的更改放在哪里。但是,如果您的项目设置比较复杂,重用现有存储库可能更方便。


+1 以前从未使用过“-r”,下次遇到这种情况,我会尝试一下。 - Adam Houldsworth
当我使用SVN时,我为项目的每个分支创建了一个Eclipse工作区。我想我也可以用Mercurial做到这一点,也许这是解决问题最实际的方法。 - Lasse L
@LasseL:你可以选择最适合你的! :) - Laurens Holst
@LaurensHolst - 方法一非常糟糕:克隆的存储库将成为源代码的完全镜像,使用主存储库返回更改是愚蠢的。方法二:a)push -r不能有参数“。”,只能使用 cset ID 2)N-heads 分支只能使用 -f 推送,必须在推送之前进行合并。 - Lazy Badger
@LazyBadger:“非常错误”,真的吗?在发表这样强烈言论之前,请更加了解情况。首先,我不明白为什么您认为克隆是个问题?它是一个DVCS,充分利用它的优势。它是硬链接的,所以如果您担心磁盘空间占用,不必担心。2. push -r 绝对可以带有参数,它是当前工作副本变更集ID的别名。因为您只推送了工作副本的头部,所以您不需要合并正在进行中的功能分支。 - Laurens Holst

1

第四种方法:使用 mq 补丁

  • 您必须启用并初始化 mq 扩展程序以供仓库使用

在热修复时,您需要执行以下操作:

  • 将功能提交转换为一组 mq 补丁(hg qimport
  • 取消应用集合中的所有补丁(hg qpop -a
  • 编写热修复代码,提交
  • ...
  • 在干净的代码库上完成并测试热修复
  • 应用集合中的所有补丁(hg qpush -a),解决可能的冲突
  • 将补丁转换回变更集(hg qfinish

请注意,MQ(Mercurial Queues)相当复杂,不是标准 DVCS 流程的一部分。它是建立在 DVCS 之上的补丁队列系统。我不建议新手使用它。此外,它是一种修改历史记录的操作,而这些操作可以通过标准的 DVCS 流程轻松处理。 - Laurens Holst

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