Git 和 SVN 的區別

在日常開發工作中,程序員會頻繁與版本控制工具打交道來管理自己的代碼。目前用到相對比較廣泛的版本控制管理工具應該是 SVN 和 Git 。這裏主要針對這兩者的區別做個簡單的概述。

定義

SVN:是一個遠程集中式的版本控制系統,與 RCS、CVS 比較來說,SVN 採用了分支管理系統,其設計的目的是爲了取代 CVS 。
Git:是一個開源的分佈式版本控制系統,可以有效、高速地處理從小到非常大的項目版本管理。

主要區別

1.存儲方式的區別

Git 是將內容按照元數據的方式進行存儲(類似於 key/value 數據庫的形式,可以理解成Map)。
將內容丟到 Git 的類數據庫中(也就是將文件中的內容取出來存到數據庫當中),其會返回一個 key 值,這個 key 值相對於內容來說是唯一的,也就是說當插入重複的內容時所返回的 key 值是一樣的。
Git 基於 key 值獲取指定內容,將每個文件的版本中的內容都保存在其數據庫當中,當要進行版本回滾的時候,就通過其中的一個 key 值將其取回並做替換。



Git存儲示意圖

SVN 則是按照源文件的形式進行存儲。
換句話來說也就是對文件進行拷貝。
如果需要回滾的話,只需要將其對應版本的文件做替換即可。

幾乎所有的版本管理系統都是將文件的元信息隱藏在類似.svn.cvs 等文件夾當中。而 .git 文件夾則可以說是本地機器上的一個克隆版的版本倉庫,它包含了遠程中心版本倉庫上的所有東西,例如標籤,分支,版本記錄等等。所以將 .git 文件夾的體積大小與 .svn 進行比較,會發現兩者的差距很大。

2.使用方式的區別



SVN的基本使用過程圖

SVN 的使用過程相對比較簡單,針對所修改的內容提交只需要進行 commit 操作就夠了,檢出也只需要 checkout
如圖所示,無論是員工A還是員工B,在修改完代碼後只需要 commit 將修改的內容提交至遠程倉庫即可。員工C只需要通過 checkout 將內容從遠程倉庫檢出至本地。



Git的基本使用過程圖

Git 就與 SVN 完全不同。
如圖,員工A將修改的內容提交至遠程倉庫需要經過以下幾個步驟:

  • 將修改的內容通過 add 添加到本地暫存區
  • 從暫存區通過 commit 添加到我們的本地倉庫
  • 通過 push 推送到遠程倉庫

同樣,員工B從遠程倉庫檢出代碼至本地需要經過以下幾個步驟:

  • 將遠程倉庫的內容 clone 至本地倉庫
  • 從本地倉庫 checkout 檢出至本地工作空間

總的來看,從本地將新增或者修改的文件推送至遠程倉庫的過程當中,SVN 只需要 commit 一個步驟就夠了,而 Git 則需要經過 addcommitpush 三個步驟。
從遠程倉庫檢出代碼至本地工作空間的過程當中,SVN 只需要 checkout 一個步驟就夠了,而 Git 則需要經過 clonecheckout

3.版本管理模式的區別

Git 是一個分佈式的版本管理系統,而 SVN 是一個遠程集中式的管理系統。



SVN集中式管理模式圖

在這裏我們的 SVN 只支持一個遠程倉庫,如果說我們的遠程 SVN 倉庫掛掉了,那麼本地項目就不能夠進行提交、分支的切換等版本相關的任何操作。這也是集中式管理系統所存在的一個缺陷。



Git分佈式管理模式圖

本地 Git 倉庫是跟着項目走的,而不是跟着本機走的。也就是說一個項目內包含一個完整的 Git 倉庫,多個項目會包含多個 Git 倉庫。
遠程 Git 倉庫所能做的事情,本地 Git 倉庫也能做,例如:代碼的提交、版本的回滾、分支的切換等操作。
當然本地 Git 倉庫也直接能和我們的遠程 Git 倉庫進行關聯,Git 提供四種通信協議(localsshhttpgit)來支持與遠程倉庫的連接。
Git 還支持多個遠程倉庫,即一個本地 Git 倉庫能夠連接多個遠程 Git 倉庫。
所以即便是掛了一個遠程 Git 倉庫,我們仍然可以切換其他的遠程 Git 倉庫進行提交、分支的切換等版本相關的任何操作。就算是所有遠程倉庫都掛了,我們仍然能在本地 Git 倉庫進行相應的操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章