svn - 为什么在 Mercurial 中分支和 merge 比在 Subversion 中更容易?

标签 svn git version-control mercurial

在 Subversion 或 CVS 中处理对分支的多次 merge 只是必须经历的事情之一。在 Mercurial(可能还有任何其他分布式系统)中跟踪分支和 merge 非常容易,但我不知道为什么。还有人知道吗?

我的问题源于这样一个事实,即使用 Mercurial,您可以采用类似于 Subversions/CVS 中央存储库的工作实践,一切都会正常运行。您可以在同一个分支上进行多次 merge ,并且您不需要无休止的带有提交编号和标签名称的纸片。

我知道最新版本的 Subversion 有能力跟踪 merge 到分支,所以你不会遇到同样程度的麻烦,但这是他们方面的一个巨大而重要的发展,它仍然不能做所有的事情开发团队希望这样做。

它们的工作方式肯定存在根本差异。

最佳答案

In Subversion (and CVS), the repository is first and foremost. In git and mercurial there is not really the concept of a repository in the same way; here changes are the central theme.

+1

CVS/SVN 的麻烦在于这些系统 记住变化的 parent 身份。在 Git 和 Mercurial 中, 一个提交不仅可以有多个 child ,它还可以有多个 parent !

这可以使用图形工具之一轻松观察到,gitkhg 查看。在下面的示例中,分支 #2 是从 #1 fork 出来的 提交 A,并且已经 merge 一次(在 M,与提交 B merge ):

o---A---o---B---o---C         (branch #1)
     \       \
      o---o---M---X---?       (branch #2)

请注意 A 和 B 有两个 child ,而 M 有两个 parent 。这些 关系在存储库中记录。假设维护者 分支 #2 现在想 merge 分支 #1 的最新更改,他们可以 发出命令,例如:

$ git merge branch-1

并且该工具会自动知道base 是 B——因为它 记录在提交 M 中,它是 #2 尖端的祖先——并且 它必须 merge 发生的一切 B 和 C 之间。CVS 不记录此信息,之前的 SVN 也没有 版本 1.5。在这些系统中,图 看起来像:

o---A---o---B---o---C         (branch #1)
     \    
      o---o---M---X---?       (branch #2)

其中 M 只是 A 和 B 之间发生的所有事情的巨大“压缩”提交, 应用在 M 之上。请注意,在契约完成后,没有痕迹 离开(除了可能在人类可读的评论中)M所做的 起源于,也不是有多少提交被折叠在一起——制作 历史更加难以理解。

更糟糕的是,执行第二次 merge 变成了一场噩梦:必须弄清楚 第一次 merge 时的 merge 基础是什么(一个人已经知道 首先是 merge !),然后 将该信息呈现给工具,这样它就不会尝试重播 A..B M 的顶部。在密切合作的情况下,所有这些都已经够困难了,但是 在分布式环境中根本不可能。

一个(相关的)问题是没有办法回答这个问题:“X 包含 B?"其中 B 是 a 潜在的重要错误修复。那么,为什么不只在提交中记录该信息,因为 它在 merge 时已知!

P.-S。 -- 我没有使用 SVN 1.5+ merge 记录功能的经验,但工作流程似乎要多得多 比在分布式系统中做作。如果确实如此,那可能是因为——如前所述 在上面的评论中——重点放在存储库组织上,而不是更改本身。

关于svn - 为什么在 Mercurial 中分支和 merge 比在 Subversion 中更容易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43995/

相关文章:

linux - 如果 authorized_keys 中给出了 "svnserve -t",如何通过 ssh 登录?

svn - 当 --quiet 时, checkout (co) svn 上的项目是否更快?

当 master 和分支领先于当前提交时,Git rebase 到标签上

version-control - 如何删除RCS中的文件?

Github pull 请求显示太多更改/提交

Flash 源代码控制 - 最佳实践

svn - Jenkins Subversion 插件凭据错误

git - 如何列出 git 存储库中的所有缓存文件和未跟踪文件?

git - 为什么 `git submodule` 每次都需要从远程存储库中获取?

git - 仅还原推送提交的单个文件