git工作原理

直接記錄快照,而非差異比較

Git 和其它版本控制系統(tǒng)的主要差別在于 Git 對待數(shù)據(jù)的方法,其它大部分系統(tǒng)以文件變更列表的方式存儲(chǔ)信息,這類系統(tǒng)將它們保存的信息看作是一組基本文件和每個(gè)文件隨時(shí)間逐步累積的差異。存儲(chǔ)每個(gè)文件與初始版本的差異,如圖所示

Git 并不保存這些前后變化的差異數(shù)據(jù)。實(shí)際上,Git 更像是把變化的文件作快照后,記錄在一個(gè)微型的文件系統(tǒng)中。每次提交更新時(shí),它會(huì)縱覽一遍所有文件的指紋信息并對文件作一快照,然后保存一個(gè)指向這次快照的索引。為提高性能,若文件沒有變化, Git 不會(huì)再次保存,而只對上次保存的快照作一鏈接。 Git 的工作方式如圖所示

近乎所有操作都是本地執(zhí)行

在 Git 中的絕大多數(shù)操作都只需要訪問本地文件和資源,不用連網(wǎng)。因?yàn)?Git 在本地磁盤上就保存著所有當(dāng)前項(xiàng)目的歷史更新,所以處理速度飛快。
例如,如果要瀏覽項(xiàng)目的歷史更新摘要, Git 可以直接從本地?cái)?shù)據(jù)庫讀取后展示給你看。如果想要看當(dāng)前版本的文件和一個(gè)月前的版本之間有何差異,Git 會(huì)取出一個(gè)月前的快照和當(dāng)前文件作一次差異運(yùn)算,而不用請求遠(yuǎn)程服務(wù)器來做這件事,或是把老版本的文件拉到本地來作比較。如果是svn,雖然可以編輯文件,但無法提交更新,因?yàn)閿?shù)據(jù)庫在網(wǎng)絡(luò)上。

時(shí)刻保持?jǐn)?shù)據(jù)完整性

在保存到 Git 之前,所有數(shù)據(jù)都要進(jìn)行內(nèi)容的校驗(yàn)和(checksum)計(jì)算,并將此結(jié)果作為數(shù)據(jù)的唯一標(biāo)識和索引。這項(xiàng)特性作為 Git的設(shè)計(jì)哲學(xué),建在整體架構(gòu)的最底層。所以如果文件在傳輸時(shí)變得不完整,或者磁盤損壞導(dǎo)致文件數(shù)據(jù)缺失,Git 都能立即察覺。
Git使用SHA-1算法計(jì)算數(shù)據(jù)的校驗(yàn)和,通過對文件的內(nèi)容或目錄的結(jié)構(gòu)計(jì)算出一個(gè)SHA-1哈希值,作為指紋字符串。該字串由40個(gè)十六進(jìn)制字符(0-9 及 a-f)組成。
Git 的工作完全依賴于這類指紋字串,所以你會(huì)經(jīng)常看到這樣的哈希值。實(shí)際上,所有保存在 Git 數(shù)據(jù)庫中的東西都是用此哈希值來作索引的,而不是靠文件名。

多數(shù)操作僅添加數(shù)據(jù)

你執(zhí)行的 Git 操作,幾乎只往 Git 數(shù)據(jù)庫中增加數(shù)據(jù)。 很難讓 Git 執(zhí)行任何不可逆操作,或者讓它以任何方式清除數(shù)據(jù)。
同別的 VCS 一樣,未提交更新時(shí)有可能丟失或弄亂修改的內(nèi)容;但是一旦你提交快照到 Git 中,就難以再丟失數(shù)據(jù),特別是如果你定期的推送數(shù)據(jù)庫到其它倉庫的話。

文件的三種狀態(tài)

對于任何一個(gè)文件,在 Git 內(nèi)都只有三種狀態(tài):
已提交(committed),已修改(modified)和已暫存(staged)
已提交表示該文件已經(jīng)被安全地保存在本地?cái)?shù)據(jù)庫中了;
已修改表示修改了某個(gè)文件,但還沒有提交保存;
已暫存表示把已修改的文件放在下次提交時(shí)要保存的清單中。
由此我們看到 Git 管理項(xiàng)目時(shí),文件流轉(zhuǎn)的三個(gè)工作區(qū)域:
Git的工作目錄(working directory),暫存區(qū)域(staging area),以及本地倉庫(repository)

基本的Git工作流程
  1. 在工作目錄中修改某些文件
  2. 對修改后的文件進(jìn)行快照,然后保存到暫存區(qū)域
  3. 提交更新,將保存在暫存區(qū)域的文件快照永久轉(zhuǎn)儲(chǔ)到 Git 目錄中

我們可以從文件所處的位置來判斷狀態(tài):
如果是 Git 目錄中保存著的特定版本文件,就屬于已提交狀態(tài);
如果作了修改并已放入暫存區(qū)域,就屬于已暫存狀態(tài);
如果自上次取出后,作了修改但還沒有放到暫存區(qū)域,就是已修改狀態(tài)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。