首先,每一個 git 目錄都有一個名為 .git 的隱藏目錄,關于 git 的一切都存儲于這個目錄里面(全局配置除外)。這個目錄里面有一些子目錄和文件,文件其實不重要,都是一些配置信息,后面會介紹其中的 HEAD 文件。子目錄有以下幾個:
- info:這個目錄不重要,里面有一個 exclude 文件和 .gitignore 文件的作用相似,區別是這個文件不會被納入版本控制,所以可以做一些個人配置。
- hooks:這個目錄很容易理解, 主要用來放一些 git 鉤子,在指定任務觸發前后做一些自定義的配置,這是另外一個單獨的話題,本文不會具體介紹。
- objects:用于存放所有 git 中的對象,下面單獨介紹。
- logs:用于記錄各個分支的移動情況,下面單獨介紹。
- refs:用于記錄所有的引用,下面單獨介紹。
假設我們在一個空倉庫里,編輯了 2 個文件,然后提交。此時都會有那些對象呢?
首先會有兩個數據對象,每個文件都對應一個數據對象。當文件被修改時,即使是新增了一個字母,也會生成一個新的數據對象。
其次,會有一個樹對象用來維護一系列的數據對象,叫樹對象的原因是它持有的不僅可以是數據對象,還可以是另一個樹對象。比如某次提交了兩個文件和一個文件夾,那么樹對象里面就有三個對象,兩個是數據對象,文件夾則用另一個樹對象表示。這樣遞歸下去就可以表示任意層次的文件了。
最后則是提交對象,每個提交對象都有一個樹對象,用來表示某一次提交所涉及的文件。除此以外,每一個提交還有自己的父提交,指向上一次提交的對象。當然,提交對象還會包含提交時間、提交者姓名、郵箱等輔助信息,就不多說了。