git檔案物件
一、.git資料夾分析
.git資料夾有git倉庫管理的必須檔案,且只有當前目錄有.git檔案才能使用git命令。通過git clone
和git init
命令初始化。
•object資料夾:儲存了檔案物件,並使用sha-1演算法生成40位雜湊值將前兩位作為資料夾,後38位作為檔名。
•config檔案:git倉庫的配置檔案,跟git config
命令有關。
•head檔案:分支的指示指標,head指向哪個分支表示當前git倉庫處於哪個分支上。
•index檔案:表示暫存區。
二、檔案物件
git有三種檔案物件,分別是blob、tree、commit。blob物件儲存當前版本的檔案快照,tree儲存著目錄結構和 blob 物件索引,commit儲存著指向前述樹物件的指標和所有提交資訊。舉個例子:
1、在test_1資料夾裡面初始化了git庫,並且建立乙個檔案test_1.c,並寫入include
。
2、使用git add test_1.c
將test_1.c檔案加入暫存區,可以在./test/.git/objects/
下生成了乙個新的資料夾35(這是數字是sha-1演算法生成的,將前兩位作為資料夾名,後38位作為檔名),35資料夾下有乙個名為4499acd60e01f6d3b56ed83f0a8d077effb0f2
的檔案,該檔案就是blob物件,儲存的是test_1.c的檔案快照。使用git cat-file -p 354499
(這個命令可以查詢4499ac這個檔案的內容,-t檢視物件型別的有blob、tree、commit三種型別,384499是40位雜湊值的6位縮寫代表乙個檔案物件)查詢,可以得出命令的輸出值就是前面寫入的include
,使用-t引數輸出blob,也就代表當前的物件屬於blob物件。所以當一次修改被加入暫存區時git會用blob儲存當前修改的檔案快照,同乙個目錄下對於同名內容一致的檔案採用同乙個物件儲存,也就是說在當前目錄下,假設是另乙個資料夾下有乙個test_1.c且內容和前乙個一致,那麼這兩個檔案共用同乙個檔案物件,即354499。
3、為了解釋tree和commit物件,在test目錄下新建乙個test_2資料夾,並且建立test_2.c檔案,寫入#include
。提交到暫存區git add test_2
,然後git commit
提交git倉庫。然後轉到objects資料夾會發現物件檔案變成了5個,如下圖。為什麼會變成5個?按照之前的理解是add了兩個檔案,所以有兩個blob物件,然後commit一次後會產生乙個tree物件和乙個commit物件,總共應該是4個物件檔案。實際上不是這樣的,準確來說git會為每個資料夾生成乙個tree物件,類似檔案目錄的樹結構,在本例中有兩個資料夾因此git生成了兩個tree物件,所以總共有5個檔案物件。下面細看這幾個檔案物件的內容,blob物件就不重複說了。git cat-file -p 檔名
97、c8、ff輸出如下圖,可以得出97是commit物件,包含了提交資訊和tree的指標,該物件指向ff物件。我們看看ff tree物件的內容,包含了乙個blob物件記錄test_1.c檔案資訊,還包含乙個樹物件指向c8即test_2資料夾。最後看看c8 tree物件,包含乙個blob物件記錄test_2.c檔案資訊。由此可以分析出git將資料夾目錄下的檔案資訊抽象成blob物件,並將這個集合抽象成tree物件,根據資料夾的層級抽象出多棵子樹。最後將根節點抽象成乙個commit物件。
三、總結
現在回過頭來看git的檔案區間是不是感覺很好懂,git相當於乙個檔案管理員,本地檔案未add時,git並不知道這個檔案,一旦add git就將這些檔案生成blob物件並納入管理,在暫存區(index)生成相應的索引,使用git ls-files --stage
可以檢視index檔案的內容,可以看到index檔案儲存的就是blob物件的雜湊值和檔案路徑。commit做的事就是將blob物件打包成tree和commit物件,儲存到本地倉庫,這相當於一次改動的集合。仔細思考為什麼git的所有操作都這麼的迅速,主要的原因是每次add、commit操作時都以物件檔案的方式儲存了所有的改動資訊,這些物件檔案都有不重複的雜湊值,且相同的檔案具有相同的雜湊值,通過雜湊值的校驗,git可以快速的進行操作。
Git學習筆記(四) Git物件
git cat file t id號 檢視此id號對應的物件型別 commit tree parent blob git cat file p id號 檢視此id號對應的物件內容 這些物件儲存在git庫中的objects目錄下 id前兩位作為目錄名,後38位作為檔名 通過commit物件之間的相互關...
git物件(git權威指南筆記)
1 檢視日誌詳盡輸出 git log l pretty raw id型別 commit tree 目錄 blob 檔案 檢視id型別 git cat file t id 檢視物件內容 git cat file p id git cat file p 668bcec git cat file p a1...
git學習 七 git 物件庫
1 git log l pretty raw 檢視日誌 l是幹啥的 2 git log pretty raw 3 git cat file t 雜湊值 檢視id的型別 不知道為啥這裡我不一樣 即使用git log l pretty raw也只是出現commit的,但是git cat file p 雜...