一. 基本對象類型
Git中有四種基本對象類型,組成了Git更高級的數據結構:
- blobs
每個blob代表一個(版本的)文件,blob只包含文件的數據,而忽略文件的其他元數據,如名字、路徑、格式等。 - trees
每個tree代表了一個目錄的信息,包含了此目錄下的blobs,子目錄(對應於子trees),文件名、路徑等元數據。因此,對於有子目錄的目錄,git相當於存儲了嵌套的trees。 - commits
每個commit記錄了提交一個更新的所有元數據,如指向的tree,父commit,作者、提交者、提交日期、提交日志等。每次提交都指向一個tree對象,記錄了當次提交時的目錄信息。一個commit可以有多個(至少一個)父commits。 - tags
tag用於給某個上述類型的對象指配一個便於開發者記憶的名字, 通常用於某次commit。
在.git/objects/中存儲了所有的對象,如用命令
find .git/objects -type f
列舉出所有對象如下(這里只列四個作為例子)
.git/objects/06/cd8f74b5114222c74d2042b7d7b6a57feb7a74
.git/objects/08/a69220e57387cd1b6207d147be44d54b356af4
.git/objects/0e/e6ff926999e39a1c61c470bc435224a74ba0a5
.git/objects/56/f0a1291c46803558687eeea807e07ae1a861ef
git用SHA1值的前兩個數字來分目錄存儲對象,因此上述四個對象分別為
06cd8f74b5114222c74d2042b7d7b6a57feb7a74 08a69220e57387cd1b6207d147be44d54b356af4 0ee6ff926999e39a1c61c470bc435224a74ba0a5
56f0a1291c46803558687eeea807e07ae1a861ef
用命令
git cat-file -t <SHA1> git cat-file -p <SHA1>
可以分別查看對象的值和內容。一般地,使用SHA1值的前面幾位(而不是全部)就可以區分不同的對象,因此上述命令中可以用如git cat-file -t 06cd8f。
二. 如何查看對象的SHA1值
- 查看文件的SHA1值,用命令
git hash-object file
- 查看SHA1值對應的對象的內容,也可用命令
git show <SHA1>
- 查看commits,可用命令
git log --pretty=oneline
這會給出commit的歷史記錄。每行行首顯示了每次提交的SHA1值。然后用
git show <SHA1>
顯示commit的內容。
- 查看每次commit指向的tree,用命令(如對commit 5ca6fc)
git rev-parse 5ca6fc^{tree}
會顯示5ca6fc指向的tree的SHA1。如果想進一步查看tree的內容,用命力
git show 5ca6fc^{tree}
或者
git cat-file -p 5ca6fc^{tree}
后者輸出形如
100644 blob 76018072e09c5d31c8c6e3113b8aa0fe625195ca file1 100644 blob 5716ca5987cbf97d6bb54920bea6adde242d87e6 file2 100644 blob 10e2d16377371e6436ba3779e62381fdaf8fcfbf file3 040000 tree edf40c2308b255c4aebc34aa9cce134131778a14 src
可以看出,這個tree包含三個blob和一個子tree。
- 查看tag,可用
git tag
列出所有的tag。對於某個tag “v1”,用命令
git rev-parse v1
查看tag的SHA1值。