树对象
Git 的树对象类似于文件系统的文件夹。文件系统的文件夹 引用的是其他的文件夹和文件,而树对象引用的是其他的树对象和数据对象。
文件系统 | Git Tree |
---|---|
其他文件夹 | 树对象 |
文件 | 数据对象 |
下面是四组图,对文件系统和树对象进行比较。
文件系统
这张图里展示了最常见的文件系统和文件:
- 有三个文件夹:src,docs 和 顶层目录。
- 有四个文件,分别是 README,hello.c,hello.py 和 hello。这些文件的内容在灰色的盒子里。
Git 对象仓库
这张图展示了在用户向 git 仓库提交之后,文件和文件夹是怎么在对象仓库里面被存为树对象和数据对象的。
顶层树对象的哈希值是 391791a。这个对象引用了三个对象:
- 包含 README 文件的数据对象
- 包含 src 文件夹的树对象
- 包含 doc 文件夹的树对象
对象的哈希值
这张图添加了注释,展示了每个对象的哈希值是怎么在树对象里使用的。
不带名字标签的对象
前面的图里面的对象都带有文件名,但是实际上 Git 的存储机制决定了文件是由哈希值而不是文件名标识的。
查找 tree 和 blob 对象的命令
上面的图画出了树对象和数据对象在对象仓库里的样子,现在在命令行试着把他们找出来:
暂存、提交:
$ git add .
$ git status
# On branch master
# Changes to be committed:
# (use "git rm --cached ..." to unstage)
# new file: README
# new file: docs/hello
# new file: src/hello.c
# new file: src/hello.py
$ git commit -m "init"
列出暂存的文件:
$ git ls-files --stage --abbrev
100644 bccdfbd 0 README
100644 ddd8641 0 docs/hello
100644 6403d7d 0 src/hello.c
100644 dd7a98c 0 src/hello.py
找出顶层树对象的哈希值:
$ git cat-file -p HEAD
tree 39179a1d15da96b6594a87eac3bac631a6c728e8
author Tim Flagg <[email protected]> 1297723281 -0800
committer Tim Flagg <[email protected]> 1297723281 -0800
顶层树对象的哈希值是 39179a,和图中的对应。然后可以找到这个对象的子对象的信息:
$ git ls-tree 39179a --abreve
100644 blob bccdfbd README
040000 tree 31b11e8 docs
040000 tree 05f8c83 src
相应的,docs 和 src 是树对象,它们下面还有子对象:
$ git ls-tree 31b11e8 --abbrev
100644 blob ddd8641 hello
$ git ls-tree 05f8c83 --abbrev
100644 blob 6403d7d hello.c
100644 blob dd7a98c hello.py
这些哈希值都可以和图中的匹配上。