在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
补丁是最好的选择吗?
答案 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中已有的变化集的重复。
那么,你的选择是什么?hg update C
。如果G不依赖或要求变更集D,E和F那么它不应该是他们的孩子。如果您首先更新为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
分支的错误修正合并。