代码之家  ›  专栏  ›  技术社区  ›  jonstjohn

颠覆合并:我如何清晰地重新整合一个“确定的”分支?

svn
  •  13
  • jonstjohn  · 技术社区  · 15 年前

    我们一直在尝试一种新的技术来管理我们的发布分支。

    通常,我们在主干上维护当前版本,并为每个版本创建发布分支。发布分支通常是活动开发的地方,主干用于修复当前版本的错误。

    我们已经定期地将主干中的错误修复合并到发布分支中(每周)。

    现在我们已经为另一个发布做好了准备,我们希望将发布分支合并到主干中。不幸的是,这会导致许多冲突(>50)。起初我很惊讶,但现在我明白了颠覆不能轻易地用主干中存在的东西来修正分支中的变化。

    有没有一种方法可以告诉Subversion在集成回主干时使用分支中的所有文件版本?我们知道文件的分支版本是“正确的”。

    作为另一种选择,理论上我们可以放弃主干,只需完成分支的工作——从分支分支分支进行发布。

    我们使用Tortoissevn和Subclipse。

    4 回复  |  直到 13 年前
        1
  •  11
  •   Wim Coenen    15 年前

    从输出 svn help merge :

    --接受 精氨酸

    指定自动冲突解决操作 ('推迟'、'基地'、'地雷冲突'、'他们的冲突'、'地雷满', '他们的完整'、'编辑'、'启动')

    要在合并到主干时接受分支更改,需要“ --accept theirs-full “期权。

    我认为Tortoissesvn1.6.2在GUI中没有同等的选项。你仍然可以 interactively resolve conflicts 选择“ use repository “因为合并过程中会遇到每个冲突。

        2
  •  6
  •   jpierson    13 年前

    我相信通过将错误修复从主干复制到发布分支所做的工作有时被称为 rebasing . 在这种情况下,所有的重新平衡意味着你采用一个通常基于主干的修订版R49的分支,并将主干的修订版R50-R57合并到分支中,这样在后面的话,你可以将该分支视为基于主干的修订版R57而不是修订版R49。

    实际中的问题是,当将主干或任何其他基础的一系列修订合并到其中一个分支时,它不会重置创建该分支的基础修订,而是保留正常的 mergeinfo 属性是了解合并内容的唯一方法。为了能够将分支的更改重新集成到它的基部(如主干),而不会无意中重放合并后的基部更改,例如在上一个示例中,从R50-R57合并的基部更改将通过cherry选择特定的修订来合并分支到基部的更改,其方式是重新平衡(从分支的基础)不包括在内。

    不幸的是,除此之外,由Subversion开发人员来实现一种自动化的方法,以便仅包含不包含MergeInfo属性的修订,该属性描述仅包含原始基本修订和目标修订之间的修订的合并(通常是head)。这变得更复杂了,因为合并通常包括手动更改,这些更改是通过分支上的合并提交进行提交的,合并提交将丢失,而且任何给定对象的源都必须跟踪到它的共同祖先才能正确地处理这些更改。 staircased 树枝。除此之外,允许将分支替换为基础或主干的新副本,并将以前的所有提交重新应用为一系列单独提交的功能也会使这成为可能,但不管多么尴尬,其行为更像是真正的重新平衡。

    这些评论不是一个明确的答案,但代表了我作为一个长期颠覆用户的理解。如果有人有任何其他的观点需要补充或可以在我的陈述中选择一些可能不正确的东西,请尽一切努力让我知道,以便我们能够真正了解当前实施颠覆的能力和局限性。

    更新: 根据Subversion文档,在使用 --reintegrate option 该Subversion应该能够正确地重新整合在分支中完成的工作,其方式应该考虑到可能已经完成的任何刷新合并,以将基本更改引入分支。当然,这在技术上与重新平衡有点不同,但我认为它在用法上足够相似,可以称为重新平衡。现在的主要问题是——重新整合选项是否在从基础的变更被以樱桃色的方式合并到主干中时有效,而不是从基础+下一个到头部的所有内容都被合并。

    更新: 看来 cherry picking should be supported 以及使用SVN合并时 --重新整合 1.5及以上版本的选项。按照这些说明,您应该可以重新集成,而不会由于重新引入而导致未经处理的冲突,请重新调整变更修订。

    欲了解更多信息,请阅读标题为 Keeping a Branch in Sync .

        3
  •  0
  •   pix0r    15 年前

    也许我这里遗漏了一些东西,但听起来最简单的选择是删除主干,然后通过从新的发布分支分支中分支来重新创建主干。

        4
  •  0
  •   Tom Hubbard    15 年前

    理论上,你可以做一个“合并两个不同的树”,从树干的头到树枝的头。这个 应该 避免由于重新集成而产生任何奇怪的冲突。