版本管理進化

相信你們或多或少都在工做中用過svn,git之類的版本控制工具。不過,svn和git都是怎樣存儲數據的?svn和git存儲數據有什麼差異呢?git

版本管理的進化史

1.本地化版本管理-rcs安全

他的原理就是在客戶端本地保存並管理文件布丁。由於全部的版本信息都在客戶端本地,因此他的缺點也是顯而易見的:多人沒法協同合做。

圖片描述

2.集中化版本管理-svn服務器

他的原理是有一個集中的管理服務器,在該服務器保存了全部的文件修訂版本。全部人均可以聰這個服務器存取文件。固然,它相對於上一個本地化版本管理,已經解決了多人沒法協同合做的問題。可是,服務器一旦宕機或者發生故障,則版本信息就會不安全了,這樣其實沒有太大的保障性。

圖片描述

3.分佈式版本管理-git分佈式

他的核心原理是去中心化。就像下圖所示,它不只會在服務器保存版本信息。客戶端不只提取了最新版本文件快照,還會把代碼倉庫完整鏡像下來。用戶能夠在無網的狀況下,隨意在本地進行版本提交。上面提到的集中化版本管理就沒有這樣的優點。

圖片描述

svn存儲及git存儲的差異

以下兩圖分別是svn及git存儲的原理圖。
a.svn存儲存儲的是文件的差別化。如圖中,版本2和版本1。文件A和文件C有修改,則在版本2的時候存儲該兩文件變化的部分。無論文件存儲了多少次,都是一份原始文件+多份差別文件的累積。
b.git存儲存儲的是文件快照。所謂的文件快照相似與文件自己,不過git會進行壓縮等操做。如圖中,在版本2和版本1。文件A和文件C有修改,則在版本2的時候會從新存儲已經變化的文件,而不是變化部分。實際上,git在版本管理的時候記錄的是指針。文件有變化時,會新建指針指向新的文件。而文件B沒有變化,則仍是原始版本的指針指向原來的文件。這裏的原理會在稍後部分進行詳細解析。
固然,git這樣存儲文件,而不是diff。當咱們須要查看某個版本時,只要加載對應的文件便可,不須要再merge。是一種以空間換時間的策略。svn

圖片描述
圖片描述

Git提交對象

git的每一次提交都會有3個blob文件,一個樹對象,一個提交對象,以下圖所示。
樹對象(綠色部分)存儲目錄結構及blob文件的索引。能夠看到樹對象裏面有3個blob標示,分別對應5b1d3/911e7/cba0a三個blob文件。而提交對象指向樹對象的指針及全部的提交信息。下圖的提交對象98ca9裏有一個tree的標示指向了92ec2,固然它還包含了做者等等提交信息。
圖片描述工具

而不少次的提交則會有不少次上述的提交對象,他們之間是怎樣鏈接的呢。其實在提交對象裏面還有一個parent的標示。以下圖所示,34ac2的parent是98ca9。可是由於98ca9是首次提交則parent屬性是空。
圖片描述spa

Git分支管理

以下圖所示。其實,git每次的提交不單單會有上面說的提交對象的概念,在提交對象之上,還會有分支的概念。git默認會有一個master分支。以下圖所示,咱們也能夠新建一個v1.0的分支。可是,如今有兩個分支,咱們怎麼知道咱們在哪一個分支工做呢。其實有一個HEAD的指針,該指針指向哪一個分支,目前的工做分支就是哪一個。若是咱們須要切換分支,用git checkout xxx便可。
圖片描述3d

關於git的工做區域,文件類型,具體的指令,開發流程等等,將在另一片文章詳細介紹~版本控制

相關文章
相關標籤/搜索