我经常读到 Hg(和 Git 和...)在 merge 方面比 SVN 更好,但我从未见过 Hg/Git 可以在 SVN 失败的地方(或 SVN 需要手动干预的地方) merge 某些东西的实际例子。您能否发布一些分支/修改/提交/...操作的分步列表,以显示当 Hg/Git 愉快地继续前进时 SVN 会失败的地方?实际情况,不是非常特殊的情况,请...

一些背景:我们有几十名开发人员在使用 SVN 开发项目,每个项目(或一组类似的项目)都在自己的存储库中。我们知道如何应用发布和功能分支,所以我们不会经常遇到问题(即,我们一直在那里,但我们已经学会克服“一个程序员对整个团队造成创伤”的 Joel's problems 或“需要六个开发人员两周时间才能重新整合一个分支”)。我们有非常稳定的发布分支,仅用于应用错误修正。我们的主干应该足够稳定,能够在一周内创建一个版本。我们有功能分支,单个开发人员或开发人员组可以工作。是的,它们在重新集成后会被删除,因此它们不会弄乱存储库。 ;)

所以我仍在努力寻找 Hg/Git 相对于 SVN 的优势。我很想获得一些实践经验,但是我们还没有可以迁移到 Hg/Git 的任何更大的项目,所以我一直在玩只包含几个组成文件的小型人工项目。我正在寻找一些可以让您感受到 Hg/Git 令人印象深刻的力量的案例,因为到目前为止我经常阅读有关它们但未能自己找到它们的案例。

最佳答案

我自己不使用 Subversion,但从 release notes for Subversion 1.5: Merge tracking (foundational) 看来,与 merge 跟踪在完整的 DAG 版本控制系统(如 Git 或 Mercurial)中的工作方式存在以下差异。

  • 将主干 merge 到分支与将分支 merge 到主干不同:出于某种原因,将主干 merge 到分支需要 --reintegrate 选项到 svn merge

    在像 Git 或 Mercurial 这样的分布式版本控制系统中,主干和分支之间没有技术差异:所有分支都是平等的(尽管可能存在社会差异)。以相同的方式向任一方向 merge 。
  • 您需要提供新的 -g ( --use-merge-history ) 选项到 svn log 和 0x2518122314 merge 跟踪考虑3。

    在 Git 和 Mercurial 中,显示历史(日志)和责备时会自动考虑 merge 跟踪。在 Git 中,您可以请求仅使用 svn blame(我想 Mercurial 也存在类似的选项)来关注第一个父级,以“丢弃” --first-parent 中的 merge 跟踪信息。
  • 据我了解 git log 属性存储有关冲突的每个路径信息(Subversion 是基于变更集的),而在 Git 和 Mercurial 中,它只是提交可以有多个父级的对象。
  • Subversion 中 merge 跟踪的“已知问题”小节表明重复/循环/反射 merge 可能无法正常工作。这意味着对于以下历史记录,第二次 merge 可能不会做正确的事情('A' 可以是主干或分支,'B' 可以分别是分支或主干):

    **---*---x---*---y---*---*---*---M2 \\/
    --*----M1---*---*---/
    在上述 ASCII-art 被破坏的情况下:分支 'B' 从修订版 'x' 的分支 'A' 创建( fork ),然后分支 'A' 在修订版 'y' merge 到分支 'B' 为 merge 'M1',最后分支'B'被 merge 到分支'A'中作为 merge 'M2'。

    **---*---x---*-----M1--*---*---M2 \//
    \-*---y---*---*---/

    在上述 ASCII 艺术被破坏的情况下:分支 'B' 从修订版 'x' 的分支 'A' 创建( fork ),它在 'y' 处 merge 到分支 'A' 作为 'M1',然后再次 merge 到分支“A”中作为“M2”。
  • Subversion 可能不支持 criss-cross merge 的高级案例。

    **-b-----B1--M1--**---M3
    \\//
    \ X /
    \/\/
    \--B2--M2--*

    Git 在实践中使用“递归” merge 策略很好地处理这种情况。我不确定 Mercurial。
  • 在“已知问题”中有警告说 merge 跟踪可能不适用于文件重命名,例如当一侧重命名文件(并可能对其进行修改),而另一侧在不重命名的情况下修改文件(在旧名称下)。

    Git 和 Mercurial 在实践中都能很好地处理这种情况:Git 使用 重命名检测 ,Mercurial 使用 重命名跟踪 0x251819411341111。

  • HTH

    关于git - merge : Hg/Git vs. SVN,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2475831/

    10-15 06:32