SVN与git的区别【图文经典版】
2019獨角獸企業重金招聘Python工程師標準>>>
設計模式的差異
1、集中化的版本控制系統
集中化的版本控制系統( Centralized Version Control Systems,簡稱 CVCS )。這類系統,諸如 CVS,Subversion 以及 Perforce 等,都有一個單一的集中管理的服務器,保存所有文件的修訂版本,而協同工作的人們都通過客戶端連到這臺服務器,取出最新的文件或者提交更新。多年以來,這已成為版本控制系統的標準做法(見下圖1)。
圖1
這種系統最顯而易見的缺點是中央服務器的單點故障。如果宕機一小時,那么在這一小時內,誰都無法提交更新,也就無法協同工作。要是中央服務器的磁盤發生故障,碰巧沒做備份,或者備份不夠及時,就會有丟失數據的風險。最壞的情況是徹底丟失整個項目的所有歷史更改記錄,而被客戶端偶然提取出來的保存在本地的某些快照數據就成了恢復數據的希望。但這樣的話依然是個問題,你不能保證所有的數據都已經有人事先完整提取出來過。本地版本控制系統也存在類似問題,只要整個項目的歷史記錄被保存在單一位置,就有丟失所有歷史更新記錄的風險。
2、分布式版本控制系統
分布式版本控制系統( Distributed Version Control System,簡稱 DVCS )會把服務器上的代碼倉庫完整地鏡像下來。這樣每個人的電腦上都有一份完成的服務器代碼倉庫的鏡像,任何一處協同工作用的服務器發生故障,事后都可以用個人的電腦上的像出來的本地倉庫恢復。因為每一次的提取操作,實際上都是一次對代碼倉庫的完整備份(見下圖2)。我們可以看到電腦A與電腦B與服務器上的版本內容完全一致
?
圖2
版本存儲方式的差異
1、直接記錄快照,而非差異比較
Git 和其他版本控制系統的主要差別在于,Git 只關心文件數據的整體是否發生變化,而大多數其他系統則只關心文件內容的具體差異。這類系統(CVS,Subversion,Perforce,Bazaar 等等)每次記錄有哪些文件作了更新,以及都更新了哪些行的什么內容,請看下圖3。
?
圖3 . 其他系統在每個版本中記錄著各個文件的具體差異
?
Git 并不保存這些前后變化的差異數據。實際上,Git 更像是把變化的文件作快照后,記錄在一個微型的文件系統中。每次提交更新時,它會縱覽一遍所有文件的指紋信息并對文件作一快照,然后保存一個指向這次快照的索引。為提高性能,若文件沒有變化,Git 不會再次保存,而只對上次保存的快照作一鏈接。Git 的工作方式就像圖 4 所示。
?
圖 4. Git 保存每次更新時的文件快照
?
這是 Git 同其他系統的重要區別。它完全顛覆了傳統版本控制的套路,并對各個環節的實現方式作了新的設計。Git 更像是個小型的文件系統,但它同時還提供了許多以此為基礎的超強工具,而不只是一個簡單的 VCS。稍后在第三章討論 Git 分支管理的時候,我們會再看看這樣的設計究竟會帶來哪些好處。
2、近乎所有操作都是本地執行
在 Git 中的絕大多數操作都只需要訪問本地文件和資源,不用連網。但如果用 CVCS 的話,差不多所有操作都需要連接網絡。因為 Git 在本地磁盤上就保存著所有當前項目的歷史更新,所以處理起來速度飛快。
舉個例子,如果要瀏覽項目的歷史更新摘要,Git 不用跑到外面的服務器上去取數據回來,而直接從本地數據庫讀取后展示給你看。所以任何時候你都可以馬上翻閱,無需等待。如果想要看當前版本的文件和一個月前的版本之間有何差異,Git 會取出一個月前的快照和當前文件作一次差異運算,而不用請求遠程服務器來做這件事,或是把老版本的文件拉到本地來作比較。
用 CVCS 的話,沒有網絡或者斷開 VPN 你就無法做任何事情。但用 Git 的話,就算你在飛機或者火車上,都可以非常愉快地頻繁提交更新,等到了有網絡的時候再上傳到遠程倉庫。同樣,在回家的路上,不用連接 VPN 你也可以繼續工作。換作其他版本控制系統,這么做幾乎不可能,抑或非常麻煩。比如 Perforce,如果不連到服務器,幾乎什么都做不了(譯注:默認無法發出命令?p4 edit file?開始編輯文件,因為 Perforce 需要聯網通知系統聲明該文件正在被誰修訂。但實際上手工修改文件權限可以繞過這個限制,只是完成后還是無法提交更新。);如果是 Subversion 或 CVS,雖然可以編輯文件,但無法提交更新,因為數據庫在網絡上。看上去好像這些都不是什么大問題,但實際體驗過之后,你就會驚喜地發現,這其實是會帶來很大不同的。
3、時刻保持數據完整性
在保存到 Git 之前,所有數據都要進行內容的校驗和(checksum)計算,并將此結果作為數據的唯一標識和索引。換句話說,不可能在你修改了文件或目錄之后,Git 一無所知。這項特性作為 Git 的設計哲學,建在整體架構的最底層。所以如果文件在傳輸時變得不完整,或者磁盤損壞導致文件數據缺失,Git 都能立即察覺。
Git 使用 SHA-1 算法計算數據的校驗和,通過對文件的內容或目錄的結構計算出一個 SHA-1 哈希值,作為指紋字符串。該字串由 40 個十六進制字符(0-9 及 a-f)組成,看起來就像是:
24b9da6552252987aa493b52f8696cd6d3b00373Git 的工作完全依賴于這類指紋字串,所以你會經常看到這樣的哈希值。實際上,所有保存在 Git 數據庫中的東西都是用此哈希值來作索引的,而不是靠文件名。
4、多數操作僅添加數據
常用的 Git 操作大多僅僅是把數據添加到數據庫。因為任何一種不可逆的操作,比如刪除數據,都會使回退或重現歷史版本變得困難重重。在別的 VCS 中,若還未提交更新,就有可能丟失或者混淆一些修改的內容,但在 Git 里,一旦提交快照之后就完全不用擔心丟失數據,特別是養成定期推送到其他倉庫的習慣的話。
這種高可靠性令我們的開發工作安心不少,盡管去做各種試驗性的嘗試好了,再怎樣也不會弄丟數據。
?
?
?
?
?
?
?
?
?
參考:https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80
?
?
轉載于:https://my.oschina.net/wangyuzhan/blog/1619534
總結
以上是生活随笔為你收集整理的SVN与git的区别【图文经典版】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读HDFS文件
- 下一篇: 生成器表达式 内置函数