如何使用Mercurial的svnmerge工作流程?

时间:2009-07-08 10:34:08

标签: mercurial svn-merge merge-tracking

svnmerge有助于阻止特定分支的某些更改集。如何通过Mercurial实现这一目标?

1 个答案:

答案 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,则无需记住已合并的修订版本。