Git 對象類型
Git 對象有如下四種:
- blob
- tree
- commit
- tag
blob 對象
blob 只是一個字節(jié)塊慕嚷,可以用來存儲文件、源代碼或者圖片等等转锈。
tree 對象
tree 就像文件系統(tǒng)目錄。一個 tree 可以指向或者包含:
- blob 對象晾咪,就像文件系統(tǒng)目錄包含文件一樣
- tree 對象场钉,就像文件系統(tǒng)目錄有子目錄一樣
commit 對象
每次執(zhí)行 git commit 成功后盟萨,就會創(chuàng)建一個新的 commit 對象圈纺。一個 commit 對象至少包含:
- 提交 commit 的人的相關信息链沼,比如名字和郵箱默赂,以及提交 commit 的時間
- 與 commit 相關的評論信息
- tree 的哈希值,這個 tree 表示提交這個 commit 后的 git 倉庫
一個 commit 對象還有可能包含父 commit括勺,除了初始 commit 不包含父 commit 外缆八,其它 commit 都含有父 commit 的哈希值。如果一個 commit 有不止1個父 commit疾捍,那么肯定有 git merge 行為奈辰。
tag 對象
一個 tag 對象指向一個 commit 對象,可以用來引用某個特定的 tree.
一個 tag 對象包括:
- tag 的名字
- tag 所指向的 commit 對象
- tag 評論信息
- 打 tag 的人的名字和郵箱乱豆,以及打 tag 的時間
相關命令
## 打 tag
git tag -m 'tag message' tag-name [commit-hash-value]
## 查看 tag 信息
git cat-file -p tag-name
## 列出所有 tag
git tag -l
## checkout tag
git checkout tag-name
git add 做了什么
當執(zhí)行如下命令時奖恰,git 對象存儲發(fā)生了什么變化呢?
git add filename
- 計算文件內容的SHA1哈希值
- 在 .git/objects 目錄中創(chuàng)建子目錄咙鞍,子目錄名字即為上述哈希值的前兩個字符
- 在子目錄中創(chuàng)建一個 blob 對象房官,blob 對象包含了 filename 文件的內容,blob 的名字即為上述哈希值的后38個字符
- 把文件名 filename 及上述哈希值加到 .git/index 索引文件中
假如 filename 文件內容的SHA1哈希值是4b5fa63702dd96796042e92787f464e28f09f17d续滋,那么子目錄的名字為4b翰守,blob 的名字為5fa63702dd96796042e92787f464e28f09f17d。因此疲酌,blob 的完整路徑為 .git/objects/4b/5fa63702dd96796042e92787f464e28f09f17d
相關命令
## 查看文件的哈希值
git hash-object filename
## 根據(jù)哈希值查看文件內容
git show blob-hash-value
blob 對象的存儲結構
blob 對象是這樣構造的:
- 文件頭蜡峰,由對象類型(即 blob)、被 add 文件的大小朗恳、一個 null 字節(jié)構成
- 文件頭后接著是被 add 文件的內容
- 然后 zlib 壓縮整個文件得到 blob 對象
tree 對象的存儲結構
tree 對象的存儲結構類似于文件系統(tǒng)中目錄的存儲結構湿颅,tree 和目錄對應,而 blob 和文件對應粥诫。tree 對象中的每一條記錄由如下三個字段組成:
- 對象類型油航,tree 或者 blob
- 對象哈希值
- 目錄或者文件的名字
相關命令
## 查看最近一次 commit 的信息
git cat-file -p HEAD
## 查看 tree 的內容
git ls-tree tree-hash-value