我如何在Mercurial中挑选一个修订版?

时间:2009-11-03 20:54:51

标签: mercurial tortoisehg cherry-pick

在Mercurial / TortoiseHg中,给出以下示例,将修订版“G”合并到回购A而不采用D,E和F(假设G不依赖于D,E或F)的最简单方法是什么。

Repo A: A - B - C

Repo B (Clone of A) A - B - C - D - E - F - G

补丁是最好的选择吗?

2 个答案:

答案 0 :(得分:76)

Tonfa是对的。你所描述的不是'合并'(或'推'或'拉');这是'挑选'。推或拉将所有变更集从一个仓库移动到另一个仓库中尚未存在的仓库中。 'merge'需要两个'head'并将它们合并为一个新的变更集,这是两者的组合。

如果你真的需要移动G但是不可能遵守D,E,F那么你应该从回购A“hg export”G,然后在回购A中“hg import”它。{{3是导出/导入的包装器,带有一些细节,有助于避免多次移动相同的变更集。

然而,一般使用导入/导出,移植和挑选的缺点是,如果没有其祖先,你无法真正移动G,因为在Mercurial中,变更集的 name 是它的'hashid',包括其父项的哈希值。不同的父母(G的新父母将是C而不是F)意味着不同的哈希,所以它不再是G - 这是G的工作,但是名称是新的变更集。

将G作为新事物移动,我们称之为G'(Gee prime),对某些用途来说不是什么大问题,但对于其他用途来说,它是一个很大的皮塔饼。当很快回购B获得一个新的变更集H时,你希望将它移动到它的父变量将从G变为G',它们具有不同的哈希值。这意味着H将移动为H' - 100变换集,你将拥有不同的哈希值,因为你无法在回购A中拥有D,E,F。

如果/当你想把东西从Repo A转移到Repo B(与之前的行动方向相反)时,事情会变得更加糟糕。如果你试图从A到B做一个简单的'hg push',你将获得G'(和H'以及后续的后代),这将是你在Repo B中已有的变化集的重复。

那么,你的选择是什么?

  1. 不在乎。您的数据仍然存在,您最终会使用不同名称的相同变更集,并在未来两个回购交易所之间进行更多工作。这没有错,也许有点笨拙,有些人不在乎。
  2. 将所有D,E和F移到Repo A。如果它们无害,您可以移动所有变更集并避免所有麻烦。如果它们没有那么无害,你可以移动它们然后做一个'hg backout'来消除D,E和F在新的变更集H中的影响。
  3. 开始时给予G更好的亲子关系。这对我来说是值得一提的,因为走这条路线为时已晚(没有Transplant extension)。在处理变更集G之前,应该完成的工作是hg update C。如果G不依赖或要求变更集D,E和F那么它不应该是他们的孩子。
  4. 如果您首先更新为C,则会有如下图形:

    A - B - C - D - E - F
              \
                G
    

    然后,这个问题的整个答案就是hg push -r G ../repoA,G会干净利落地移动,保持相同的哈希值,D,E和F不会随之而去。

    <强>更新

    正如评论中指出的那样。使用现代Mercurials,hg graft命令是完成此操作的最佳方式。

答案 1 :(得分:40)

参考标题,一般说明樱桃采摘,我给出了在一个回购中工作的例子,因为互联网搜索引擎可能会把人们带到这里进行樱桃采摘。在一个存储库中工作,将使用hg graft

完成
hg update C
hg graft G

结果是:

            G'
          / 
A - B - C - D - E - F - G

额外警告:这两个变更集将被视为对相同文件的独立并行提交,并可能使您遇到合并冲突,这就是为什么应该避免对分支管理进行分析。例如,如果G是应用于标记为1.0.1的稳定版本分支的错误修复,则应该合并 freeze分支,并且不时将master分支与freeze分支的错误修正合并。