svnmerge有助于阻止特定分支的某些更改集。如何通过Mercurial实现这一目标?
答案 0 :(得分:6)
什么subversion调用合并与Mercurial中的合并有很大不同。 svnmerge或svn merge
所做的操作在其他版本控制系统中通常被称为“樱桃选择”。基本上它会创建一个新提交,它是目标分支中原始变更集的副本。在Mercurial中,可以使用transplant extension。
与常规合并相比,这种方法在DVCS中不太受欢迎,因为它创建了多个头部,这些头部难以维护。以下是您将如何使用它以及结果输出的样子:
$ hg checkout -r 8
$ hg branch release
$ hg transplant 10
applying 8ba2867cf974
8ba2867cf974 transplanted to 1f5920f61c94
7---8---9---A [default]
\
B [release]
在这里你有你的提交A来修复trunk上的bug并且你hg transplant
要释放它,创建一个新的提交B,其中包含与A相同的更改但是父母不同。
替代方法是不使用移植并仅检查发布分支的修复程序。您将创建一个新的发布分支并在那里进行修复,然后您将发布分支合并为默认值。这看起来像这样:
$ hg checkout -r 8
$ hg branch release
... fix fix fix ...
$ hg commit -m"Make fix A"
$ hg checkout -r 9
$ hg merge release
1 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg commit -m"Merged release branch"
7---8---9---B- [default]
\ /
A---- [release]
这里B是合并提交。它没有与之关联的“额外”更改(除非存在已解决的冲突),并且具有将发布分支标记为在该点合并为默认值的特殊属性。只有一个实际的变更集可以修复错误 - 标记为“A”的错误 - 当然,更改本身也在默认分支中。
这种方法的优点是:
通常你会在适当的时候标记发布分支“v1.1”或其他任何内容,以便你知道该版本的来源。
这种方法的缺点是:
第一个问题没有什么可以做的 - 如果你必须维护一个非常老的分支,那么你最终会得到不同的分支。无论如何,补丁可能非常不同。
第二个问题是,例如,如果发布版本的“紧急”补丁发布或解决了一个错误,但需要更大的默认修复来解决潜在问题。在这种情况下,您必须合并release,然后创建一个新的显式提交以“撤消”您不想要的提交。
这种做法在某种程度上实际上与svn merge
具有相似的优势。如果有选择地将更改从trunk更改为release,则必须记住合并的修订(假设您没有合并所有trunk)。 svn merge
设置了svn:mergeinfo属性,但跟踪这些属性可以cause problems,而且你必须仔细检查日志,说“哦,是的,我确实将该修复合并到了发布中”。
如果在修复后将svn-merge整个发布分支合并到trunk,则无需记住已合并的修订版本。