天天看點

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 的協同工作。

繼續閱讀