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