GIT底層原理(一)

2021-08-19 20:10:44 字數 2099 閱讀 4542

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

注意:所有儲存在git 資料庫中的東西都是用此雜湊值來作索引的,不是靠檔名。

在使用git commit 新建乙個提交物件前,git 會先計算每乙個子目錄(專案根目錄)的校驗和,然後在git 倉庫中將這些目錄儲存為樹(tree)物件。之後git 建立的提交物件,除了包含相關提交資訊以外,還包含著指向這個樹物件(專案根目錄)的指標,如此它就可以在將來需要的時候,重現此次快照的內容了。

例如:乙個專案裡假如有三個檔案readme,license,test.rb,commit後倉庫裡會儲存五個物件。

之後修改後再次提交。那麼新的commit物件會包含上一次提交物件的指標parent。經過兩次提交後,倉庫歷史結構(git log)

git的分支是十分的輕量級,git的新建分支,合併分支等操作幾乎是瞬間完成。

1、git 建立乙個新的分支僅僅是建立乙個新的分支指標。如:git branch testing 建立乙個testing分支;會commit 物件上新建乙個分支指標並指向當前commit

2、,git 是如何知道當前在哪個分支上工作的呢?有乙個名為head 的特別指標,執行git branch 命令,僅僅是建立了乙個新的分支,但不會自動切換到這個分支中,所以當前我們仍然在master分支。

3、要切換到其他分支,執行git checkout  命令。我們現在轉換到新建的testing 分支:git checkout testing,git僅僅是將head指標指向了testing,幾乎瞬間完成。

4、如果這時我們再次修改了檔案,並提交(git commit ),僅僅是testing分支指向了最新commit ,而master仍指向在原來的commit

5、使用git checkout master切換回master分支。git做了兩件事它把head 指標移回到master 分支,並把工作目錄中的檔案換成了master 分支所指向的快照內容。

6、在master分支我們修改檔案再進行提交,這時專案提交歷史產生了分叉。

git 中的分支實際上僅是乙個包含所指物件校驗和(40 個字元長度sha-1 字串)的檔案,所以建立和銷毀乙個分支就變得非常廉價。新建乙個分支就是向乙個檔案寫入41 個位元組(外加乙個換行符)。

如果我們有需要我們可以完全再次checkout到testing分支去開發新的功能。我們可以在分支間隨意切換,並且都是瞬間切換完成。這和之前大多數版本控制系統形成了鮮明對比,它們管理分支大多採取備份所有專案檔案到特定目錄的方式,所以根據專案檔案數量和大小不同,可能花費的時間也會有相當大的差別,快則幾秒,慢則數分鐘。而git 的實現與專案複雜度無關,它永遠可以在幾毫秒的時間內完成分支的建立和切換。每次提交時都記錄了祖先資訊(譯註:即parent 物件),所以以後要合併分支時,尋找恰當的合併基礎(譯註:即共同祖先)的工作其實已經完成了一大半。

Git 底層原理

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

git底層原理(二)

git物件模型 在git系統中有四種型別的物件,所有的git操作都是基於這四種型別的物件 blob 這種物件用來儲存檔案的內容。tree 可以理解成乙個物件關係樹,它管理一些 tree 和 blob 物件。commit 指向乙個 tree 它用來標記專案某乙個特定時間點的狀態。它包括以下關於時間點的...

Git底層原理和結構

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