2010-02-21

Subversion 用户眼中的 Git (7): 完全不同的分支和里程碑的实现

Subversion 曾经骄傲的宣称,自己的分支是轻量级的,眨眼之间分支立现。但是说实话,Subversion的分支和里程碑,是 svn copy 命令的副产品,好像是折衷的产物。 Git 分支一出,无人敢于争风,信乎?

Subversion 和 Git 的分支/里程碑都是轻量的

轻量级分支/里程碑的含义是,创建分支/里程碑的复杂度是 o(1),不会因为版本库的愈加庞大而变得缓慢。在 CVS 中,创建分支的复杂度是 o(n) 的,导致大的版本库的的分支创建非常缓慢。 Subversion 轻量级分支的实现是通过 svn cp 命令,即带历史的拷贝就是创建快速创建分支和里程碑的秘籍。 Git 的轻量级分支和里程碑就是全球唯一的提交号的别名,其中分支对应的是 git 树状提交的分支顶极节点。

Git 的分支是完全隔离的,而 Subversion 则没有

分支本来就应该是相对独立的命名空间,这在 Git 中是没有问题的,一个提交只能发生在唯一的一个分支中,虽然提交可以通过 cherry-pick 被“挑选”合并到其他分支。 Subversion 的分支相当于目录拷贝,约定俗成是拷贝在 branches/ 目录下,目录之间的隔离完全靠着使用者的自觉自愿,谁也不能阻止在一个提交中同时修改不同分支中的数据。

Git 的里程碑是只读的,而 Subversion 仅凭约定俗成的自觉自愿

里程碑是对某个历史提交所起的一个别名,作为历史的标记,是不应该被更改的。 Git 完全遵守历史不可更改这一时空法则。用户不能向 git 的里程碑中提交,否则里程碑就不是标记,而成了一个分支。当然 Git 允许用户删除里程碑再重新创建指定到不同历史提交。 Subversion 的里程碑和分支一样,都是用 svn cp 的带历史的拷贝创建的,作为一个子目录而存在。约定俗成,svn 的里程碑要建立到 tags/ 目录下,要求不要在 tags/ 下的里程碑目录下进行提交。但是谁也阻止不了对未进行权限控制的里程碑的篡改。

Git 完备的里程碑和分支功能,另 Git 能完整克隆 SVN 版本库

很多分布式版本控制系统的分支功能是缺乏的,如 hg。因为像 hg/mercurial 这样的分布式版本控制系统,可以通过克隆来创建分支,即每个克隆都可以视为一个独立的分支。这就使得 hg 这样的缺乏分支的版本库很难完整的克隆一个 subversion 版本库。 Git 拥有完备的分支和里程碑功能,并且如前所述,其分支和里程碑管理比 SVN 还要优秀,这样就造就了一个工具 git-svn。工具 git-svn 实现了 git 对 svn 版本库的完整克隆,以及和 svn 的协同工作。
blog comments powered by Disqus