Svn 为什么Mercurial比Subversion更容易进行分支和合并?

Svn 为什么Mercurial比Subversion更容易进行分支和合并?,svn,git,version-control,mercurial,Svn,Git,Version Control,Mercurial,在Subversion或CVS中处理分支上的多个合并只是必须经历的事情之一。在Mercurial(可能还有其他任何分布式系统)中跟踪分支和合并非常容易,但我不知道为什么。还有人知道吗 我的问题源于这样一个事实:使用Mercurial,您可以采用类似于Subversions/CVSs中央存储库的工作实践,并且一切都会正常工作。您可以在同一个分支上进行多个合并,而不需要无休止的带有提交编号和标记名的纸片 我知道最新版本的Subversion具有跟踪分支合并的能力,因此您不会遇到同样程度的麻烦,但这对

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

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

我知道最新版本的Subversion具有跟踪分支合并的能力,因此您不会遇到同样程度的麻烦,但这对他们来说是一个巨大而重大的开发,它仍然没有完成开发团队希望它完成的所有事情


这一切的运作方式肯定有根本的不同。

我只有Subversion方面的经验,但我可以告诉你,TortoiseSVN中的合并屏幕非常复杂。幸运的是,他们包括一个试运行按钮,这样你就可以看到你做得是否正确。复杂之处在于要合并到何处的配置。一旦你为合并做了设置,合并通常会顺利进行。然后,您需要解决所有冲突,然后将合并的工作副本提交到存储库


如果Mercurial可以使合并的配置更容易,那么我可以说合并将比Subversion容易100%。

我想这可能部分是因为Subversion有一个中央服务器的想法以及一个绝对的修订时间线。Mercurial是真正分布式的,没有绝对的时间线。这确实允许Mercurial项目形成更复杂的分支层次结构,以便按子项目添加功能和测试周期,但是团队现在需要更积极地保持在合并的顶部,以保持最新状态,因为他们不能只点击更新并完成更新。

在Subversion(和CVS)中,存储库是首要的。在git和mercurial中,存储库的概念并不完全相同;这里的变化是中心主题

我也没有想过如何实现,但我的印象(基于痛苦的经验和大量的阅读)是,这种差异使得在非基于存储库的系统中合并和分支变得更加容易。

因为Subversion(至少版本1.4及以下)没有跟踪已合并的内容。对于Subversion,合并与任何提交基本相同,而在其他版本控制(如Git)上,合并的内容会被记住

在Subversion(和CVS)中,存储库是首要的。吉特 而mercurial在应用程序中并没有真正的存储库概念 同样的方式;这里的变化是中心主题

+一,

CVS/SVN中的麻烦源于这样一个事实,即这些系统不而 记住变化的起源。在Git和Mercurial中, 提交不仅可以有多个子项,还可以有多个子项 父母

使用图形工具之一,
gitk
hg可以轻松观察到
查看
。在下面的示例中,分支#2是从#1分叉的 提交A,并已合并一次(在M处,与提交B合并):

请注意,A和B有两个孩子,而M有两个父母。这些 关系记录在存储库中。让我们说一下 分支2现在要合并分支1的最新更改,可以 发出命令,例如:

$ git merge branch-1
工具会自动知道基数是B,因为它 记录在commit M中,它是#2的祖先——和 不管发生了什么,它都必须合并 在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的位置 源于,也不知道有多少个提交被折叠在一起--使 历史更令人费解

更糟糕的是,执行第二次合并变成了一场噩梦:我们必须弄清楚 第一次合并时的合并基础是什么(必须知道 首先是合并!),然后 将该信息呈现给工具,使其不会尝试在上重播A..B 在密切合作的情况下,所有这些都是很困难的,但事实并非如此 在分布式环境中根本不可能

一个(相关的)问题是没有办法回答这个问题:“X 包含B吗?“其中B是a 潜在的重要错误修复。那么,为什么不在commit中记录这些信息呢 这是已知的合并时间

附言——我没有SVN 1.5+合并录制功能的经验,但工作流程似乎更复杂 与分布式系统相比,人工智能更先进。如果真的是这样的话,那可能是因为——正如前面提到的
在上面的评论中,重点放在存储库组织上,而不是更改本身。

Hg提供了卓越的合并功能,因为它在合并更改时使用了更多信息():

例如,如果我更改一个函数a 一点点,然后把它移到某个地方 否则,Subversion不会真的 记住这些步骤,所以当它来临时 是时候合并了,它可能会认为 新功能刚刚从应用程序中出现 蓝色而Mercurial会记得的 这些东西是分开的:功能 更改,功能移动,这意味着 如果你也改变了这个函数 有一点,可能性更大 Mercurial将成功合并
o---A---o---B---o---C         (branch #1)
     \    
      o---o---M---X---?       (branch #2)