git 儲存原理

2021-08-17 07:30:29 字數 2429 閱讀 9429

git與傳統的版本控制工具的區別在於 分布式。

每乙個開發者都可以有自己的版本庫,可以對自己的版本庫提交,修改。對本地庫的修改可以在斷網的情況下進行。同時,專案組還有乙個中心庫,就git是分布式的,專案組也必須保證有乙份最最「權威」的**在中心庫,這份**就是穩定版本,是最終可以上線的版本。雖然git是分布式的,但是最終還會有「集中化」的味道。不過相比於傳統的svn等集中式工具,git還是有優勢的,主要體現在,開發者對於主庫的依賴明顯減少。每乙個人都可以把主庫拉下來然後進行離線操作,最終基於分支開發,合到主庫里,靈活性大大增加。

那麼每乙個git的本地庫是如何實現的?

這就涉及到了git中的物件概念,在git實現中共有tag,tree,commit和blob四種物件。這裡只看後三個。blob是最基本的儲存單元,對應git中要管理的每乙個檔案,二進位制形式。tree對應的是目錄,裡面是檔案或者其他目錄,當然只需要儲存檔名或者目錄名即可。git不僅僅會管理單一檔案,所以tree可以包含一組檔案或者資料夾。commit是每一次提交,包含了本次提交的所有檔案的根目錄所對應的tree的引用。commit是乙個鍊錶,所以還有前乙個提交的引用。

以上所有的物件都儲存在專案根目錄下的.git資料夾下,這也是儲存維護git資訊的目錄。

假設乙個專案包含aa目錄下的b.txt:

進入.git目錄下,可以看到:

檢視head內容:

可以看到,refs/heads目錄下儲存了全部的分支,這裡只有master乙個分支,檢視master的內容,是一串字元。接著再看一下log:

發現第一次提交的id和這個檔名一樣,所以refs/heads下的每乙個分支名的檔案儲存的是當前分支的最後一次提交的id。

其實這一串字元也有含義,前面說了commit其實是乙個檔案,儲存下.git下的objects目錄下。而這串字元正是commit檔案的hash值。這種命名方式貫穿了git的全部檔案的命名。

可以使用cat-file工具檢視這個commit的id:

此次commit包含了乙個tree的id和乙個父commit的id。

可以看到該tree包含了另乙個tree物件,也就是aa目錄對應的tree物件。

繼續:

可以看到aa目錄的tree下包含了b.txt這個檔案的blob。

最終看到了b.txt的內容,也就是blob儲存的內容。

接著進入.git/objects目錄。

git儲存這些檔案時會按照前幾位劃分為若干資料夾,最後的blob檔名是資料夾+檔名的組合,每乙個資料夾不會太大。此時總共有4個檔案,1個commit,1個blob和2個tree。

此時如果在aa目錄同級加乙個a.txt,內容與b.txt相同:

可以看到,a.txt和b.txt內容相同名字不同,結果git並沒有新建乙個blob,而是復用了b.txt的blob,所以git儲存檔案只看內容而不看檔名。結果也多了乙個tree,包含了a.txt和aa目錄。

如果修改a.txt為內容呢?

最終,多了乙個blob,而且包含aa和a.txt的tree也多了乙個,但是aa對應的tree不變,因為該目錄下的檔案不變。

git使用hash值作為檔名,主要是為了對比差異,只要檔案變了,那麼該檔案的hash值就會變,與老版本的檔名就不同,就可以據此判定有差異,這個資訊會隨著資料夾向上傳遞,也就催生了不同的tree包含這些不同的blob。

所以搞清楚了git底層的這三種物件是理解git儲存的關鍵。

git儲存檔案只看內容;根據內容生成hash值;基於底層的blob名構建不同的tree;commit指向tree。

git儲存原理

一,git 中的儲存分為四種物件分別是 commit物件,tag物件,tree物件,blob物件 commit物件 每個執行git commit 時都會產生 tag物件 執行git tag時會產生 tree物件 執行git commit時會產生乙個頂級樹物件,就是對應著目錄 blob物件 具體儲存資...

git基礎原理

分布式管理與集中式管理 比較一 比較二 git的工作區域與檔案不同的狀態 每提交一次,都會包含乙個指向前乙個提交物件的指標,預設為master,並且自動向前移動。master 指向新的版本 新建乙個分支 git branch name 時,例如testing分支 git branch testing...

git原理簡介

git 究竟是怎樣的乙個系統呢?請注意,接下來的內容非常重要,若是理解了 git 的思想和基本工作原理,用起來就會知其所以然,游刃有餘。在開始學習 git 的時候,請不要嘗試把各種概念和其他版本控制系統 諸如 subversion 和 perforce 等 相比擬,否則容易混淆每個操作的實際意義。g...