代碼版本控制用SVN還是Git好?
收集整理每周優(yōu)質(zhì)開發(fā)者內(nèi)容,包括開源項目、工具資源、技術(shù)文章等方面,每周五首發(fā)于,歡迎大家Star并收藏!
工作幾年,項目開發(fā)過程中,剛好SVN和Git都用過很長時間。
在對比SVN和Git到底哪個好之前,首先需要解釋一個概念:版本控制系統(tǒng)。
這樣更加有助于大家對代碼版本控制有個全局清晰的認(rèn)識。
1 版本控制系統(tǒng)
版本控制系統(tǒng)是用來跟蹤、制作和管理軟件代碼變化的工具。它能夠幫助開發(fā)者存儲不同階段對文件所做的每一個改動,這樣我們、或者與我們協(xié)作開發(fā)的同事就可以在檢索到這些改動。
目前主要包含3種類型的版本控制系統(tǒng):
本地版本控制系統(tǒng)
集中式版本控制系統(tǒng)
分布式版本控制系統(tǒng)
下面,就分別介紹一下這3種版本控制系統(tǒng)。
1.1 本地版本控制系統(tǒng)

本地版本控制系統(tǒng)是位于你本地計算機上的一個本地數(shù)據(jù)庫,其中每個文件的變化都以補丁的形式存儲。
每一個補丁集只包含自上一版本以來對該文件所做的修改。
為了看到文件在任何給定時刻的樣子,有必要將文件的所有相關(guān)補丁按順序羅列在一起,直到逐個查看找到對應(yīng)的版本為止。
本地版本控制系統(tǒng)有一個很大的問題,所有東西都儲存在本地。如果本地數(shù)據(jù)庫出了什么問題,所有的補丁都會丟失。如果一個版本發(fā)生了什么事情,那么這個版本之后的所有修改都會丟失。
另外,與其他開發(fā)者或團隊合作是非常困難的。
1.2 集中式版本控制系統(tǒng)

集中的版本控制系統(tǒng)有一個包含所有文件版本的服務(wù)器,多個用戶可以同時訪問服務(wù)器上的文件,把它們拉到他們的本地計算機上,或者從他們的本地計算機上把它們推到服務(wù)器上。
相對本地版本控制系統(tǒng),這與其他開發(fā)者或團隊的合作變得容易。
這種結(jié)構(gòu)的最大問題是,所有東西都存儲在集中式服務(wù)器上。如果該服務(wù)器出了問題,沒有人可以保存他們的版本變化,拉動文件或進行協(xié)作。
與本地版本控制類似,如果數(shù)據(jù)庫被破壞,而備份沒有被保留,你就會失去整個項目的歷史,除了人們碰巧在他們的本地機器上有的單一快照。
比較知名的集中式版本控制系統(tǒng)有Microsoft Team Foundation Server (TFS)和SVN。
1.3 分布式版本控制系統(tǒng)

有了分布式版本控制系統(tǒng),用戶不僅是從服務(wù)器上拉取最新的文件快照,而是一種完全鏡像存儲庫,包括全部歷史。
因此,在一個項目上合作的每個人都擁有整個項目的本地拷貝,換句話說,擁有自己的本地數(shù)據(jù)庫和自己的完整歷史。
在這種模式下,如果服務(wù)器變得不可用或出了問題,任何一個用戶資源庫都可以將項目的版本拷貝發(fā)送給其他用戶,或者在服務(wù)器可用時再推回到服務(wù)器上。只要一個用戶包含一個正確的副本就足夠了。
2 Git vs SVN
下面,就分別從服務(wù)器架構(gòu)、分支管理、訪問控制、存儲要求、可用性等方面對比Git和SVN的差異。
2.1 服務(wù)架構(gòu)
Git 軟件被安裝在本機上,每個開發(fā)者在個人電腦上都有一個項目完整版本歷史的拷貝。

Git的各種操作發(fā)生在本地,同時充當(dāng)客戶端和服務(wù)器,所以,開發(fā)人員不必一直處于聯(lián)機狀態(tài)。
SVN具有相互獨立的服務(wù)器和客戶端。只有開發(fā)者正在處理的文件被保存在本地機器上,而開發(fā)者必須處于聯(lián)機狀態(tài),每次操作,用戶檢出最新文件,然后再將修改提交到服務(wù)器上。

2.2 分支
SVN 分支是在版本庫中以目錄形式創(chuàng)建的,這種目錄結(jié)構(gòu)是SVN分支的核心痛點。
由于SVN是一種目錄,因此,它不能反映出開發(fā)者信息,這樣,就很容易造成沖突、缺失、雜亂無章等問題。
這使得分支和合并模式變得復(fù)雜,這在管理上也很費時。
Git 分支只是對某次提交的引用,它是輕量級的。
你可以在任何時候創(chuàng)建、刪除和改變一個分支,而不會影響到提交的內(nèi)容。
如果你需要測試一個新功能或發(fā)現(xiàn)一個錯誤,你可以建立一個分支,進行修改,將提交推送到中央倉庫,然后刪除該分支。
2.3 訪問控制
默認(rèn)情況下,Git 假設(shè)所有的開發(fā)者都有相同的權(quán)限。
相反,SVN可以指定每個文件級別和每個目錄級別的讀和寫權(quán)限控制,權(quán)限控制方面更加精細。
2.4 存儲要求
Git 倉庫不能處理大型二進制文件。
SVN倉庫除了可以處理代碼外,還可以處理大型二進制文件。
在SVN中存儲大型二進制文件會比在Git中占用更少的空間。
2.5 可用性
SVN不僅可以使用命令行,也可以作為一款客戶端工具使用,不僅可以用于管理代碼,還可以管理非代碼類文件。
Git以命令行使用為主,而且,由于服務(wù)架構(gòu)相對復(fù)雜,因此,使用方面有一定學(xué)習(xí)成本。
作為版本管理方面比較知名的兩款工具,它們分別是集中式管理和分布式管理的代表,各有擅長的方向,很難下定結(jié)論哪個更好。
如果你要管理大型二進制文件或者非代碼資產(chǎn),SVN更具有優(yōu)勢。如果你對離線管理,或者對于分支和合并有更復(fù)雜的要求,那么可以選擇Git。
建議大家有空可以多瀏覽Github,有很多非常優(yōu)秀的開源項目。但是,目前Github上項目多如牛毛,而且刷榜現(xiàn)在也非常嚴(yán)重,想要找到優(yōu)質(zhì)的項目變得越來越難。這里,給大家推薦Github上一個非常不錯的項目《DevWeekly》,這個項目每周都會精挑細選一些優(yōu)質(zhì)的開源項目,涵蓋C++、JAVA、JavaScript、Python、Go等不同編程語言。此外,還有一些開源工具、優(yōu)秀的技術(shù)文章,喜歡的同學(xué)可以Star并收藏一下,每周五會定期更新: