Cherry-pick不同回购之间的变更集

时间:2013-10-29 00:15:19

标签: mercurial cherry-pick backport

我有两个mercurial存储库,genericspecific,它是第一个repo的克隆:

$ hg glog -R generic 
@  changeset:   0:d516ded3bf0a
   summary:     generic project commit

$ hg glog -R specific 
@  changeset:   3:5f7b2efea94b
|  summary:     added another specific project change
o  changeset:   2:e2ad52001bcf
|  summary:     added generic project change (backport)
o  changeset:   1:a4220a2c7a80
|  summary:     added specific project change
o  changeset:   0:d516ded3bf0a
   summary:     generic project commit

现在我想将specific中的变更集2后移到generic。我不想添加变更集1和3,只需要cs 2(cherry-pick)。似乎有两种选择:transplantgraft。移植是可以的,因为它允许从另一个存储库(在我的情况下从specificgeneric)移动补丁,但它在合并功能方面有限。另一方面,移植将提供更智能的合并,但不支持从另一个回购移植(仅在同一分支之间)。

目标是仅将specific中的变更集2添加到generic。这就是我的进展,但没有成功。

$ cd specific
$ hg up 0 # the common ancestor
$ hg branch backport-cs2
$ hg graft 2

$ hg glog
@  changeset:   4:1405acc4a121
|  branch:      backport-cs2
|  tag:         tip
|  parent:      0:d516ded3bf0a
|  summary:     added generic project change (backport)
|
| o  changeset:   3:5f7b2efea94b
| |  summary:     added another specific project change
| |
| o  changeset:   2:e2ad52001bcf
| |  summary:     added generic project change (backport)
| |
| o  changeset:   1:a4220a2c7a80
|/   summary:     added specific project change
|
o  changeset:   0:d516ded3bf0a
   summary:     generic project commit

到目前为止一切顺利。最后一步是将backport-cs2的分支specific拉入generic默认分支

$ cd ../generic
$ hg pull -b backport-cs2 ../specific
$ hg glog 
o  changeset:   1:1405acc4a121
|  branch:      backport-cs2
|  tag:         tip
|  summary:     added generic project change (backport)
|
@  changeset:   0:d516ded3bf0a
   summary:     generic project commit

现在在generic中有我想要的变更集,但它是在一个新的分支中,而我想在默认情况下使用它。有什么建议怎么做?关于更好的反向移植方法的想法也值得赞赏。

1 个答案:

答案 0 :(得分:1)

一般来说,你所做的很难,因为这不是一个好主意。如果这些项目真的有这么多共同点,那么它们应该有更多共同之处,而不仅仅是变更集零。例如,理想情况下,将定期合并默认的“generic” - 这是非常的常见模式。有可能让'特定'非常自定义,或者有1000个'通用'没有的文件,或100个已删除的文件,并且合并仍然会很好。这很难双向进行,但是如果你将'通用'变为'默认',你应该努力保持这种可以合并。

作为公司内部的一个例子,有一个名为'skel'的存储库,其中包含所有项目样板,并且您将新项目作为'skel'的克隆开始并不罕见。当有人更新'skel'时,比如更改使用条款文件或其他东西,你就可以将skel合并到你的项目中,即使你的项目从8个文件变为8000个 - 合并仍然有效。

那就是说,如果你不能这样做,你应该只使用transplant。使用graft可以更轻松地合并 ,因为它可以将最近的常见祖先考虑在内,并使后续移植更容易。当你只是将它从第一个变更集中删除时,这些都不适用 - 我怀疑你的合并将与移植案例的那些相同,并且移植至少包括一些元数据,这使得移植相同的变更集两次发出警告。

说如果你真的想要走上面的路线就跳过hg branch backport-cs2线。当你嫁接你只是在default的{​​{1}}分支上创建一个新的头部,这是完全没问题的,然后当你做你的拉动时,你将获得一个新的头部默认为'具体'然后你可以合并它,它将在你想要的分支上 - 但不要这样做。如果不能,请按照预期使用合并,或者只使用移植。