在日常開發工作中,程序員會頻繁與版本控制工具打交道來管理自己的代碼。目前用到相對比較廣泛的版本控制管理工具應該是 SVN 和 Git 。這裏主要針對這兩者的區別做個簡單的概述。
定義
SVN:是一個遠程集中式的版本控制系統,與 RCS、CVS 比較來說,SVN 採用了分支管理系統,其設計的目的是爲了取代 CVS 。
Git:是一個開源的分佈式版本控制系統,可以有效、高速地處理從小到非常大的項目版本管理。
主要區別
1.存儲方式的區別
Git 是將內容按照元數據的方式進行存儲(類似於 key/value
數據庫的形式,可以理解成Map)。
將內容丟到 Git 的類數據庫中(也就是將文件中的內容取出來存到數據庫當中),其會返回一個 key
值,這個 key
值相對於內容來說是唯一的,也就是說當插入重複的內容時所返回的 key
值是一樣的。
Git 基於 key
值獲取指定內容,將每個文件的版本中的內容都保存在其數據庫當中,當要進行版本回滾的時候,就通過其中的一個 key
值將其取回並做替換。
Git存儲示意圖
Git存儲示意圖
SVN 則是按照源文件的形式進行存儲。
換句話來說也就是對文件進行拷貝。
如果需要回滾的話,只需要將其對應版本的文件做替換即可。
幾乎所有的版本管理系統都是將文件的元信息隱藏在類似.svn
、.cvs
等文件夾當中。而 .git
文件夾則可以說是本地機器上的一個克隆版的版本倉庫,它包含了遠程中心版本倉庫上的所有東西,例如標籤,分支,版本記錄等等。所以將 .git
文件夾的體積大小與 .svn
進行比較,會發現兩者的差距很大。
2.使用方式的區別
SVN的基本使用過程圖
SVN的基本使用過程圖
SVN 的使用過程相對比較簡單,針對所修改的內容提交只需要進行 commit
操作就夠了,檢出也只需要 checkout
。
如圖所示,無論是員工A還是員工B,在修改完代碼後只需要 commit
將修改的內容提交至遠程倉庫即可。員工C只需要通過 checkout
將內容從遠程倉庫檢出至本地。
Git的基本使用過程圖
Git的基本使用過程圖
Git 就與 SVN 完全不同。
如圖,員工A將修改的內容提交至遠程倉庫需要經過以下幾個步驟:
- 將修改的內容通過
add
添加到本地暫存區 - 從暫存區通過
commit
添加到我們的本地倉庫 - 通過
push
推送到遠程倉庫
同樣,員工B從遠程倉庫檢出代碼至本地需要經過以下幾個步驟:
- 將遠程倉庫的內容
clone
至本地倉庫 - 從本地倉庫
checkout
檢出至本地工作空間
總的來看,從本地將新增或者修改的文件推送至遠程倉庫的過程當中,SVN 只需要 commit
一個步驟就夠了,而 Git 則需要經過 add
、commit
、push
三個步驟。
從遠程倉庫檢出代碼至本地工作空間的過程當中,SVN 只需要 checkout
一個步驟就夠了,而 Git 則需要經過 clone
、checkout
。
3.版本管理模式的區別
Git 是一個分佈式的版本管理系統,而 SVN 是一個遠程集中式的管理系統。
SVN集中式管理模式圖
SVN集中式管理模式圖
在這裏我們的 SVN 只支持一個遠程倉庫,如果說我們的遠程 SVN 倉庫掛掉了,那麼本地項目就不能夠進行提交、分支的切換等版本相關的任何操作。這也是集中式管理系統所存在的一個缺陷。
Git分佈式管理模式圖
Git分佈式管理模式圖
本地 Git 倉庫是跟着項目走的,而不是跟着本機走的。也就是說一個項目內包含一個完整的 Git 倉庫,多個項目會包含多個 Git 倉庫。
遠程 Git 倉庫所能做的事情,本地 Git 倉庫也能做,例如:代碼的提交、版本的回滾、分支的切換等操作。
當然本地 Git 倉庫也直接能和我們的遠程 Git 倉庫進行關聯,Git 提供四種通信協議(local
、ssh
、http
、git
)來支持與遠程倉庫的連接。
Git 還支持多個遠程倉庫,即一個本地 Git 倉庫能夠連接多個遠程 Git 倉庫。
所以即便是掛了一個遠程 Git 倉庫,我們仍然可以切換其他的遠程 Git 倉庫進行提交、分支的切換等版本相關的任何操作。就算是所有遠程倉庫都掛了,我們仍然能在本地 Git 倉庫進行相應的操作。