git底層原理(二)

2022-08-13 08:54:14 字數 2789 閱讀 7896

git物件模型

在git系統中有四種型別的物件,所有的git操作都是基於這四種型別的物件:

"blob":這種物件用來儲存檔案的內容。

"tree":可以理解成乙個物件關係樹,它管理一些"tree"和「blob」物件。

"commit":指向乙個"tree",它用來標記專案某乙個特定時間點的狀態。它包括以下關於時間點的元資料,如時間戳、最近一次提交的作者、指向上次提交等。

"tag":給某個提交增添乙個標記。

sha1雜湊值

在git系統中,每個git物件都有乙個特殊的id來代表這個物件,這個特殊的id就是我們所說的sha1雜湊值。sha1雜湊值是通過sha1演算法計算出來的雜湊值,對於內容不同的物件,會有不同的sha1雜湊值。

例項我們以這樣的目錄結構為例來研究,

--repository      //根目錄資料夾

--a.txt        //txt檔案,初始時,內容為a_git

--bb          //資料夾

--b.txt        //txt檔案,在bb資料夾下面,內容為b_git

首先cd repository目錄,初始化使用git init命令,執行了這個命令後repository目錄下會生成乙個.git資料夾,使用find . -type f命令檢視目錄結構:

然後執行git add -a和git commit -m "commit1"兩條命令,可以看到.git/objects/資料夾下增加了五個物件

可是我們的示例工程只有兩個檔案和乙個資料夾,為什麼objects裡卻有五個檔案那,這裡就要說說commit型別了,commit型別內部可以引用乙個tree型別檔案和乙個commit型別檔案。

關於檔案的名字,objects內部的檔案全部是以sha-1命名,如果是blob型別則以檔案內容做sha-1計算得出40字元的校驗和,然後為了不讓這個objects內部檔案過多,所以使用40字元的前兩位來建立乙個資料夾,在以後38位為檔名,包括commit 和tree 全部使用sha-1校驗和來命名。

接下來說一下這五個檔案是以什麼結構關聯的:

每個commit 引用乙個tree,根據工程目錄結構這個tree 再引用乙個blob(a.txt)和乙個tree(bb) ,這個tree(bb)則引用乙個blob(b.txt)如圖:

通過這個圖就可以看出來commit,tree,blob的關係了,也基本能明白為什麼objects下有五個檔案了, 現在我改動一下a.txt然後在提交乙個版本,在a.txt新增"123456"內容然後執行add和commit,新增乙個版本,接下來再看objects內部的情況: 

比剛剛多了三個檔案,究竟是哪三個檔案?因為我們改動了a.txt檔案,所以這裡在保留上乙個版本的a.txt的基礎上新增加乙個a.txt檔案,git只對有改動的檔案進行備份保留。另外兩個檔案分別是commit 2和乙個根tree,現在這8個檔案的關係如圖:

commit檔案內部可以引用乙個commit,這樣commit之間就可以建立關係了,因為只有a.txt檔案做了改動所以只有a.txt檔案新建了乙個,然後被commit2引用,bb和b.txt檔案未做改動則commit2依然引用之前的檔案。同理如果我們再改動b.txt檔案,我們可以設想一下這些檔案的關聯關係。如圖:

branch分支

git branch 可以獲取當前的分支列表,這個分支列表會儲存在./git/refs/heads/這個路徑下,這裡包含master和一些其他分支檔案,以master檔案為例檢視master檔案內容如下:

其實這是乙個commit型別 的檔名,這樣每個分支都可以擁有乙個自己的commit引用,從上面的圖可以看出只要拿到commit的檔名就可以找到所有跟他關聯的檔案,還有個問題是./git/refs/heads/這個檔案下是所有分支資訊,總要有乙個當前分支,其實這個當前分支是被記錄在./git/head檔案內部:

因為當前是master分支所以head檔案裡記錄的是master,每次我們使用git checkout 來切換分支的時候就是在修改head這個檔案的內容。那麼我們基本就可以理解:我們首先選擇乙個分支為當前分支,每個分支裡記錄著當前分支最頂端的commit物件,這個commit物件又可以找到所有跟它關聯tree和blob,同時commit物件又和它的歷史commit關聯。我們可以任意切換當前分支,同時又可以修改當前分支指向的commit物件,比如我們執行reset可以選擇回退到任意乙個commit。這些就可以順理成章切換任意分支並且找到任意版本的檔案了。

Git 底層原理

二.git 目錄結構 三.git add 與 git commit 簡單原理 四.建立與合併分支簡單原理 五.git rebase 簡單原理 六.開始從底層入手 git 七.git add 命令底層原理 八.git add 和 git commit 中間的操作 tree 物件的生成 九.git co...

GIT底層原理(一)

暫存操作會對先每乙個檔案計算校驗和checksum git 使用sha 1 演算法計算資料的校驗和,通過對檔案的內容或目錄的結構計算出乙個sha 1 雜湊值,作為指紋字串,該字串由40 個十六進製制字元,並將此結果作為資料的唯一標識和索引 然後把當前版本的檔案快照儲存到本地git 倉庫中 git 使...

Git底層原理和結構

基礎 一 資料結構 git object 1.blob物件 echo contents a.txt會在工作目錄建立a.txt,寫入contents。即在資料結構中建立blob物件節點。echo 222 git hash object w stdin會返回儲存在git庫中的唯一鍵。w 選項會指示該命令...