【问题标题】:mercurial: apply a bugfix change from stable named branch to dev branchmercurial:将 bugfix 更改从稳定的命名分支应用到 dev 分支
【发布时间】:2011-08-23 18:45:40
【问题描述】:

我的仓库中有这两个命名的分支。稳定和开发。我的问题是如何将在 stable 中更改的 bugfix 补丁复制到 dev 分支?我真的很想在框架内做到这一点,而不是任何扩展:)

编辑

我为这个问题设置了赏金,因为我真的想要解决方案。有一个很好的解决方案,但中途离开了。所以我别无选择。现在似乎已经得到了答复。但我会让这个问题改天公平,以防万一有人有更好的解决方案。希望这是有道理的。 :)

【问题讨论】:

  • 赏金的目的是什么?
  • 查看下面的答案.. Lesse 的答案很接近,但我认为他不再可用了。我真的想要一个答案.. :) 如果有人可以回答最后几个问题。
  • 用“@Lesse”特别问他会更便宜。他很可能会回答。
  • 是的,我知道,但我仍然对任何可行的替代方案持开放态度。为狐狸创建一个分支有点奇怪.. 但我还是版本控制的新手,所以我不能仅仅根据我的直觉来称呼它。

标签: version-control mercurial


【解决方案1】:

要增加Tim's answer,另一种方法是如果可以的话,Mercurial 建议您这样做,请提前计划(我会看看能否找到链接。)

计划是,如果您知道一个错误修复/更改必须进入多个分支,那么您一开始就不会将该更改集提交到其中一个地方,而是在其他地方进行。

由于您要修复一个错误,因此在项目历史的某个地方引入了该错误。

而且由于错误修复需要进入多个分支,因此“某处”必须在分支点之前,否则错误不会出现在两个(/所有)分支中。

因此,推荐的方法是修复引入的错误,然后将该变更集合并到需要它的每个分支中。

我们来看一个例子,我们有defaultstable 分支:

1---2---3---4---5---6---7---8---9---10       default
         \               \
          \               \
           11--------------12--13            stable

然后您发现变更集 2 引入了一个错误,并且该错误修复需要同时应用于 defaultstable。你在问题中描述它的方式,看起来你会这样做:

1---2---3---4---5---6---7---8---9---10--15       default
         \               \             /^-- merge stable into default
          \               \           /
           11--------------12--13----14          stable
                                     ^-- bugfix

但这也会将变更集 13 合并到 default 中。如果您不希望这种情况发生,您可以这样做:

       v-- bugfix
       14--------------------------+--+
      /                            |   \
     /                             |    \
1---2---3---4---5---6---7---8---9--x-10--15       default
         \               \         |     ^-- merge 14 into default
          \               \        |
           11--------------12--13--16             stable
                                   ^-- merge 14 into stable

有关如何在错误修复方案中使用 Mercurial 的更多信息,9th Chapter of 'Mercurial: The Definitive Guide' 非常值得一读。

【讨论】:

  • 所以基本上你的意思是我应该创建一个包含错误修复的临时分支,然后将它合并到开发和稳定分支中?好吧,这可能会发生,但是当我将它与稳定版合并时,错误修复分支不会“消失”吗?如何合并已经合并的分支?或者即使将 bigfix 分支合并到另一个分支后,它是否会保持不受影响?就个人而言,我正在考虑使用@Tim 的第三种方法。
  • 它不会是一个命名分支,只是一个匿名分支,但它仍将是您历史的一部分,并且历史看起来与我在答案中描绘的完全一样。换句话说,如果你有我的回答显示的确切历史,它看起来就像合并后的最终图表,它不会“融入”任何一个分支并消失。
  • 很酷,所以匿名分支会继续存在吗?还是在将其合并到其他分支后手动将其杀死?还有我究竟是如何创建这样的分支的?
  • 在 Mercurial 分支中不会死亡,它们在合并到另一个分支时可能会变得不活跃。每当您在非活动分支的顶端再次提交某些内容时(例如 Lasse 示例中的 rev 14),它就会再次激活。
  • 好的,所以我简单地创建了一个命名分支,就这样?听起来很酷。
【解决方案2】:

如果您的 dev 分支是您的“稳定命名分支”的后代,那么您可以简单地

hg update dev
hg merge stable

如果这不可行,那么最自然的答案是transplant extension。此扩展随 Mercurial 一起分发,因此您只需在 mercurial.ini.hgrc 中添加一行即可启用它。启用后,您可以:

hg update dev
hg transplant --log <rev>

如果你真的想避免使用扩展,那么你可以使用exportimport

hg export --rev <rev> > tmp.patch
hg update dev
hg import tmp.patch

【讨论】:

  • export 或 import 似乎是这样,但我应该先检查一下扩展是否真的是单行。谢谢,如果需要会评论:)
  • 好的,所以对于扩展,我是否需要提及复制 &lt;rev&gt; 的哪个分支应该是 hg up stablehg transplant --log &lt;rev&gt; -b dev 行上的内容?
  • 如果您移植单个变更集,则不需要-b。如果你想从一个分支移植所有变更集,你可以使用-b。如果你同时指定-b&lt;rev&gt;,那么它会将所有变更集从分支移植到&lt;rev&gt;。建议你仔细阅读hg help transplant
  • 啊,哦 okeez .. 是的,我读到了,但很明显,我需要读更多:)
【解决方案3】:

Transplant extension 做得很好 - 正是你想要的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多