第一節:詳細透徹解讀Git與SVN的區別(集中式VS分佈式)

Git是目前世界上最先進的分佈式版本控制系統,其實 Git 跟 SVN一樣有自己的集中式版本庫或服務器,但是Git 更傾向於被使用於分佈式模式,也就是每個開發人員從中心版本庫/服務器上chect out代碼後會在自己的機器上克隆一個跟中心版本庫一模一樣的本地版本庫。可以這樣說,如果你被困在一個不能連接網絡的地方時,你仍然能夠提交文件,查看log(歷史版本記錄),創建項目分支等。

Git 和 SVN的主要差別:
  • Git 只關心文件數據的整體是否發生變化,而SVN這類版本控制系統則只關心文件內容的具體差異。這類系統(如SVN)每次記錄有哪些文件作了更新,以及都更新了哪些行的什麼內容,然而Git 並不保存這些前後變化的差異數據。實際上,Git更像是把變化的文件作快照後,記錄在一個微型的文件系統中。每次提交更新時,它會縱覽一遍所有文件的指紋信息並對文件作一快照,然後保存一個指向這次快照的索引。爲提高性能,若文件沒有變化,Git 不會再次保存,而只對上次保存的快照作一鏈接。
          -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
個人理解:Git 並沒有像 SVN一樣在每一次提交的時候都將更新的詳細信息都分析並提交,這是很科學的,因爲我們有90%的時候不會閒着要查看每一個文件都做了哪些更新,特別是模塊化開發時,那些不是我們開發的模塊,因爲Git 會在本地保存完整的歷史版本庫,有十個用戶共同開發就會有十份這樣的庫,這樣做的話會會出現非常多冗餘的數據。但是在SVN 上這樣還是科學的,因爲只有SVN 服務器上保存着唯一的一份歷史版本庫,當然是越詳細越好了。但是當遇到那10%的時候,我們想要查看一下某個文件的與昨天的版本相比的更新變動信息,Git 會取出一天前的快照和當前文件作一次差異運算,顯示出更新變動信息。
          ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  • 在Git 中的絕大多數操作都只需要訪問本地文件和資源,不必聯網就可以看到所有的歷史版本記錄,而SVN 卻需要聯網。因爲 Git 在本地磁盤上就保存着所有當前項目的歷史更新,所以處理起來速度飛快,但我們需要瀏覽項目的歷史更新摘要,Git 不用跑到外面的服務器上去取數據回來,而直接從本地數據庫讀取後展示給你看。如果想要看當前版本的文件和一個月前的版本之間有何差異,Git 會取出一個月前的快照和當前文件作一次差異運算。

  • SVN 斷開網絡或者斷開VPN就無法commit代碼,但是Git 可以先commit到本地倉庫。用SVN的話,沒有網絡或者斷開VPN時,你當然也可以繼續在本地開發,但是無法commit代碼,因爲SVN 每次commit都必須聯網,長時間不commit代碼會丟失大量開發進程的歷史紀錄。有個比喻是:不能commit就像用word寫文檔不能save一樣危險。而且有網絡的情況下每一次commit都會花上數秒甚至更長時間。但用 Git 的話,就算你在飛機或者火車上,都可以非常愉快地頻繁提交更新,因爲是在本地倉庫commit所以幾乎不需要時間,而且commit一定要頻繁,不然無法記錄你的改動,如果你一天commit一次,中間的修改你就找不回來,然後等到了有網絡的時候再將版本紀錄和代碼一起上傳到遠程倉庫。

  • Git 的內容完整性要優於SVN。因爲Git 在commit(存儲在本地)或者push(上傳到遠程倉庫)之前,通過對文件的內容目錄的結構計算出一個 SHA-1哈希值,作爲指紋字符串進行內容的校驗,並將此結果作爲數據的唯一標識和索引,在遠處倉庫接受到commit的文件之後,會再計算一遍哈希值然後跟傳遞過來的哈希值做比較,如果不一致,說明文件在傳輸時變得不完整,或者磁盤損壞導致文件數據損壞。另外在 Git 數據庫中的東西都是用此哈希值來作索引,而不是靠文件名。

  • Git 克隆一個完整項目的速度非常快,SVN 非常慢。我們以克隆一份擁有五個分支的完整項目以及版本庫來說,SVN是同時複製5個版本的文件,也就是說重複五次同樣的動作。而Git 只是獲取文件的每個版本的元素,然後只載入主要的分支(master)在我的經驗,克隆一個擁有將近一萬個提交(commit),五個分支,每個分支有大約1500個文件的 SVN,耗了將近一個小時!而Git只用了區區的1分鐘。

  • 其中最重要的區別是在於Git 上的分支遠比SVN上的強大。下面具體介紹分支的概念。

分支是什麼:
  • SVN 這類的版本控制系統上,分支(branch)是一個完整的目錄,且這個目錄擁有完整的實際文件。如果工作成員想要開啓新的分支,那將會影響“全世界”!每個人都會擁有和你一樣的分支。如果你的分支是用來對系統模塊進行安全檢查測試的,那將會像傳染病一樣,你改一個分支,還得讓其他人重新切分支重新下載,而且這些代碼很可能對穩定版本還是具有破壞性的。
  • Git上,每個工作成員可以任意在自己的本地版本庫開啓無限個分支。舉例:當我想嘗試破壞自己的程序(安檢測試),並且想保留這些被修改的文件供日後使用, 我可以開一個分支,做我喜歡的事。完全不需擔心妨礙其他工作成員。只要我不合並及提交到主要版本庫,沒有一個工作成員會被影響。等到我不需要這個分支時, 我只要把它從我的本地版本庫刪除即可,無痛無癢。

項目開發中什麼時候需要創建一個分支:

     舉個例子:我們需要開發一個新的網站,我們已經在主分支(master分支)上開發出了1.0發佈版本,這個時候我們需要開發某個新的功能模塊,那就需要創建一個分支(dev分支),而不是在主分支上繼續開發,這樣做有兩個好處:
  • 我們在開發新的功能模塊時,可能會遇到各種bug或者衝突,如果我們還在主分支上開發,萬一衝突很嚴重,造成當前穩定版本的分支出問題,就會很麻煩。如果主分支始終保留着最新的穩定版本,在新的分支上開發,衝突嚴重時,最多也就是把當前分支刪掉,從那個穩定分支重新分一支出來,這樣處理起來就方便了,而且分支還可以保留開發中可能出現的各種bug方便修復但不影響主分支多的使用。
  • 當我們需要切換分支,例如切換到主分支(master)時候,會保存當前分支(dev)的狀態,以便日後繼續開發,防止丟失開發進度。舉個例子:你突然接到一個電話說1.0發佈版本有個很嚴重的問題需要緊急修補,而我們正在dev分支上開發新的功能模塊,這時我們先返回到主分支,爲這次緊急修補建立一個新分支(repair分支),並在其中修復問題。通過測試後,回到主分支,將repair分支合並進來,然後push到遠程倉庫。最後,我們切換到之前開發新需求的dev分支,繼續工作而不會丟失掉已經開發的進度。
     我可以在Git的任意一個提交點(commit point)開啓分支!(其中一個方法是使用gitk –all 可觀察整個提交記錄,然後在任意點開啟分支。)

Git具有以下特點:
  • Git 中每個克隆(clone)的版本庫都是平等的。可以從任何一個版本庫的克隆來創建屬於自己的版本庫,同時你的版本庫也可以作爲源提供給他人,只要你願意。
  • Git 的每一次提取操作,實際上都是一次對代碼倉庫的完整備份
  • 提交完全在本地完成,無須別人給你授權,你的版本庫你作主,並且提交總是會成功。
  • Git 的提交不會被打斷,直到你的工作完全滿意了,PUSH給他人或者他人PULL你的版本庫,合併會發生在PULL和PUSH過程中,不能自動解決的衝突會提示你手工完成。

git 的缺點:
  • Git 沒有嚴格的權限管理控制,一般通過系統設置文件讀寫權限的方式來做權限控制。
  • 工作目錄只能是整個項目。比如 checkout,建分支,都是基於整個項目的。而 svn 可以基於項目中的某一個目錄


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