【问题标题】:Mercurial: How can I create an unplanned branchMercurial:如何创建计划外分支
【发布时间】:2012-10-15 11:29:45
【问题描述】:

我的用例是这样的:

我正在开发一项新功能,并且我对该功能进行了多次提交。 由于它是一个小功能,我什至没有考虑在功能分支中做这个功能。

但是。现在我的老板过来告诉我在我正在处理的同一分支上修复一个错误(默认)。

要解决我想为我的功能创建一个功能分支的问题,请将我所有现有的(未推送的)提交推送到该分支。

所以我想在我第一次提交之前创建一个分支,然后以某种方式将我所有的提交移到那个分支。

我该怎么做?

【问题讨论】:

    标签: mercurial branch commit


    【解决方案1】:

    第四种方法:使用 mq-patches

    • 您必须为 repo 启用并启动 mq 扩展

    在你的修补程序时刻

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

    【讨论】:

    • 请注意,MQ 相当复杂,并不是标准 DVCS 流程的真正组成部分。这是一个建立在 DVCS 之上的补丁队列系统。我不会向新手用户推荐它。它也是一个历史修改操作,对于一些可以由标准 DVCS 流处理的东西。
    【解决方案2】:

    有两种方法可以解决这个问题,具体取决于您的偏好:

    1. 在新的存储库中。

      为您的存储库创建一个新克隆,并在其中进行您需要的错误修复。完成后将其推送到主存储库,并从原始存储库中的中断处继续。像往常一样拉取并合并以获取新的更改。

    2. 在现有存储库中。

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

      请注意,如果您不喜欢不标记更改,您可以使用 hg bookmark 为功能分支添加书签。您还可以使用hg heads 轻松找回您留下的任何头像。

    我个人更喜欢在新的干净克隆中工作,因为您无需担心分支以及在何处留下未提交的更改。但是,如果您的项目设置很复杂,那么重用现有的 repo 可能会更方便。

    【讨论】:

    • +1 以前从未使用过-r,下次遇到这种情况时,我会试一试。
    • 当我使用 SVN 时,我为项目的每个分支都有一个 Eclipse 工作区。我想我也可以用 mercurial 做到这一点,也许这只是解决它的最实用的方法。
    • @LasseL:您可以选择最适合您的喜好! :)
    • @LaurensHolst - 方法 1 非常错误:克隆的 repo 将是源的完整镜像,使用 main-repo 来返回更改是愚蠢的。方法2:a)push -r不能有参数“.”,只有cset ID 2)N-heads分支可以only用-f推送,合并必须在推送前完成跨度>
    • @LazyBadger:“大错特错”,老实说?在做出如此强烈的声明之前,请了解更多信息。首先,我不明白你为什么认为克隆是个问题?这是一个 DVCS,利用它来发挥你的优势。它是硬链接的,所以如果您担心磁盘空间消耗,请不要担心。 2.push -r绝对可以有参数.。它是当前工作副本的变更集 ID 的别名。而且因为您只推送工作副本的头部,所以您推送多个头部,因此您不需要合并您正在进行的功能分支。
    【解决方案3】:

    对于这种情况,您可以通过rebasing 修复它(可能需要在您的配置中启用)。

    在您的分支上,更新到您要移动的变更集之前的修订:

    hg up -r<revison>
    

    这假设需要移动连续的修订。

    创建一个新分支:

    hg branch "TempWork"
    

    在其上放置一个虚拟提交以获得新的修订:

    hg commit -m"New Branch"
    

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

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

    然后更新回你的主线分支。

    【讨论】:

    • 啊,你是对的,我应该更清楚地阅读它,他已经提交了。
    • 这个答案描述了如何将您的更改重新定位到一个新的 named 分支。我认为这很丑陋; rebase 是修改历史的操作,命名分支一般不用于 ad-hoc 分支(正是因为需要提前设置,不修改历史不能追溯添加)。使用匿名分支或克隆会更好、更简单,可以选择与书签结合使用。
    • @LaurensHolst Rebase 是一种常用和公认的机制。如果更改是本地的,它工作得很好。
    • 谢谢,这看起来是我所追求的魔法尘埃。我很着急,我已经“解决”了我的退出问题,但是男孩太丑了,我破坏了构建:/下次我会尝试这种方法。
    • @LasseL 实际上,如果您可以毫无问题地使用匿名分支,您可以 hg update -r 到以前的修订版并继续按照 Laurens 的说法对代码进行新的“分叉”建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2011-02-02
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多