在Subversion(和CVS)中,存储库是最重要的。在git和mercurial中,实际上并没有以相同的方式定义存储库的概念。这里的变化是中心主题。
+1
CVS / SVN的麻烦来自于以下事实:这些系统不
记得更改的父项。在Git和Mercurial中,一个提交不仅可以有多个孩子,还可以有多个父母!
可以使用的图形工具之一很容易观察到,gitk
或hg
view
。在以下示例中,分支#2是在提交A处从#1分叉的,此后已被合并一次(在M处,与提交B合并):
o---A---o---B---o---C (branch #1)
\ \
o---o---M---X---? (branch #2)
请注意,A和B有两个孩子,而M有两个父母。这些关系记录在存储库中。假设分支2的维护者现在想合并分支1的最新更改,他们可以发出以下命令:
$ git merge branch-1
并且该工具将自动知道碱基是B,因为它记录在提交M中,即提交#2的先端,并且必须合并在B和C之间发生的任何事情。CVS不会记录此信息,版本1.5之前的SVN也没有。在这些系统中,图形如下所示:
o---A---o---B---o---C (branch #1)
\
o---o---M---X---? (branch #2)
其中M只是在A和B之间发生的所有事情的一个巨大的“压缩”提交,应用在M之上。请注意,完成契约之后,就没有留下任何迹线(可能在人类可读的注释中除外)确实起源于,也没有多少次崩溃在一起的,这使历史更加难以理解。
更糟糕的是,进行第二次合并变成了一场噩梦:一个人必须弄清楚什么合并的基础是在第一个合并的时间(和一个具有到知道
的是,已经在第一时间合并!),那么目前这信息,以便它不会尝试在M之上重播A..B。在紧密协作中,所有这些工作都非常困难,但在分布式环境中根本不可能。
一个(相关的)问题是无法回答以下问题:“ X是否包含B?” 其中B是潜在的重要错误修复。因此,为什么不将这些信息记录在提交中,因为在合并时就知道了该信息!
P.-S. -我没有SVN 1.5+合并记录功能的经验,但是工作流程似乎比分布式系统人为得多。如果确实如此,那可能是因为-正如上面的评论中所提到的-重点放在存储库组织而不是更改本身上。