1. 程式人生 > >用慣了的git commit,我們還有不知道的

用慣了的git commit,我們還有不知道的

首先,我們先回顧一下,Git 的實現基礎原理,Git 儲存的不是檔案差異或者變化量,而只是一系列檔案快照.
/ 01 /
Git 和其他版本控制系統的主要差別在於,Git直接記錄快照,而非差異比較。也就是說Git 只關心檔案資料的整體是否發生變化,而大多數其他系統則關心的是檔案內容的具體差異。 Git 並不儲存這些前後變化的差異資料。實際上,Git 更像是把變化的檔案作快照後,記錄在一個微型的檔案系統中。每次提交更新時,它會縱覽一遍所有檔案的指紋資訊並對檔案作一快照,然後儲存一個指向這次快照的索引。為提高效能,若檔案沒有變化,Git 不會再次儲存,而只對上次儲存的快照作一連結用。讓我們用一張圖來解釋一下:
實框,代表該檔案的程式碼變化了,生成新的快照,虛框代表和上次相比沒有發生變化,對上一次儲存的快照做一個連結。
/ 02 /
git add README test.rb LICENSE
在 Git 中提交時,會儲存一個提交(commit)物件,該物件包含一個指向暫存內容快照的指標。為直觀起見,我們假設在工作目錄中有三個檔案(README/test.rb/LICENSE),準備將它們暫存後提交。暫存操作(add)會對每一個檔案計算校驗和(SHA-1 雜湊字串),然後把當前版本的檔案快照儲存到 Git 倉庫中(Git 使用 blob 型別的物件儲存這些快照),並將校驗和加入暫存區域。
/ 03 /
git commit -m 'initial commit of my project'
當使用 git commit 新建一個提交物件前,Git 會先計算每一個子目錄(本例中就是專案根目錄)的校驗和,然後在 Git 倉庫中將這些目錄儲存為樹(tree)物件。之後 Git 建立的提交物件,除了包含相關提交資訊以外,還包含著指向這個樹物件(專案根目錄)的指標,如此它就可以在將來需要的時候,重現此次快照的內容了。 現在,Git 倉庫中有五個物件:三個表示檔案快照內容的 blob 物件;一個記錄著目錄樹內容及其中各個檔案對應 blob 物件索引的 tree 物件;以及一個包含指向 tree 物件(根目錄)的索引和其他提交資訊元資料的 commit 物件。概念上來說,倉庫中的各個物件儲存的資料和相互關係看起來如圖所示
/ 04 /
關注我們,遇見屬於你的精彩!