了解 Subversion 合并引擎使用的模型很重要。它与 Git 非常不同。
Subversion 支持两种基本类型的合并。第一个是“同步”合并,用于使开发(功能/任务/主题)分支与主干保持同步。第二个是“重新整合”合并,用于将完成的工作提升到主干。所以该模型是一个支持特性分支和发布分支的主线(主干)模型。
一个重要的限制是 Subversion 在搜索合并历史以找到正确的合并基础时不考虑完整的 DAG。直接相关(父子)分支之间的合并得到了很好的支持,但是在遥远的祖先或兄弟姐妹之间进行的合并,以及间接来自其他分支的贡献,通常会产生令人惊讶的结果。
正如您所指出的,Subversion 合并支持随着时间的推移而改进。它在 1.5 之前根本没有合并跟踪,在 1.8 中取得了巨大的飞跃,即将到来的 1.9 将改进重命名/移动跟踪。未来也有人谈论“本地货架”。
(顺便说一句,我知道其中的一些,因为我上周参加了 Subversion/Git Live 会议,并且在合并引擎上工作的提交者做了一个演示。)
另一方面,Git 有一个非常受人尊敬的合并引擎。它可以处理几乎任何复杂的合并。事实上,它唯一的主要合并限制是它在事后推断出移动/重命名。在非常复杂的重构情况下,它可能无法正确处理所有内容。
总结一下:
- Subversion 和 Git 在常见的合并场景中都能很好地工作。
- Git 将更有效地处理更复杂的合并场景,尤其是在没有直接父子关系的分支之间进行合并时。
- 两个系统在重构期间跟踪重命名/移动都有问题,尽管 Git 在典型情况下可能做得更好。
- Git 的合并命令在简单的情况下更容易运行。如果您进行不寻常的操作,这两个系统的学习曲线都会很陡峭。
- Git 支持相关操作,例如在存储库之间进行变基和合并,在某些情况下可以改善您的工作流程。
- 要充分利用 Subversion,请确保您拥有 1.8+ 的服务器和客户端。
希望有帮助!