我有两个mercurial存储库,generic
和specific
,它是第一个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)。似乎有两种选择:transplant和graft。移植是可以的,因为它允许从另一个存储库(在我的情况下从specific
到generic
)移动补丁,但它在合并功能方面有限。另一方面,移植将提供更智能的合并,但不支持从另一个回购移植(仅在同一分支之间)。
目标是仅将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
中有我想要的变更集,但它是在一个新的分支中,而我想在默认情况下使用它。有什么建议怎么做?关于更好的反向移植方法的想法也值得赞赏。
答案 0 :(得分:1)
一般来说,你所做的很难,因为这不是一个好主意。如果这些项目真的有这么多共同点,那么它们应该有更多共同之处,而不仅仅是变更集零。例如,理想情况下,将定期合并默认的“generic” - 这是非常的常见模式。有可能让'特定'非常自定义,或者有1000个'通用'没有的文件,或100个已删除的文件,并且合并仍然会很好。这很难双向进行,但是如果你将'通用'变为'默认',你应该努力保持这种可以合并。
作为公司内部的一个例子,有一个名为'skel'的存储库,其中包含所有项目样板,并且您将新项目作为'skel'的克隆开始并不罕见。当有人更新'skel'时,比如更改使用条款文件或其他东西,你就可以将skel合并到你的项目中,即使你的项目从8个文件变为8000个 - 合并仍然有效。
那就是说,如果你不能这样做,你应该只使用transplant
。使用graft
可以更轻松地合并 ,因为它可以将最近的常见祖先考虑在内,并使后续移植更容易。当你只是将它从第一个变更集中删除时,这些都不适用 - 我怀疑你的合并将与移植案例的那些相同,并且移植至少包括一些元数据,这使得移植相同的变更集两次发出警告。
那说如果你真的想要走上面的路线就跳过hg branch backport-cs2
线。当你嫁接你只是在default
的{{1}}分支上创建一个新的头部,这是完全没问题的,然后当你做你的拉动时,你将获得一个新的头部默认为'具体'然后你可以合并它,它将在你想要的分支上 - 但不要这样做。如果不能,请按照预期使用合并,或者只使用移植。