一. 基本对象类型
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值。