树对象

1

Git 的树对象类似于文件系统的文件夹。文件系统的文件夹 引用的是其他的文件夹和文件,而树对象引用的是其他的树对象和数据对象。

文件系统 Git Tree
其他文件夹 树对象
文件 数据对象

下面是四组图,对文件系统和树对象进行比较。

文件系统

2

这张图里展示了最常见的文件系统和文件:

  • 有三个文件夹:src,docs 和 顶层目录。
  • 有四个文件,分别是 README,hello.c,hello.py 和 hello。这些文件的内容在灰色的盒子里。

Git 对象仓库

3

这张图展示了在用户向 git 仓库提交之后,文件和文件夹是怎么在对象仓库里面被存为树对象和数据对象的。

顶层树对象的哈希值是 391791a。这个对象引用了三个对象:

  • 包含 README 文件的数据对象
  • 包含 src 文件夹的树对象
  • 包含 doc 文件夹的树对象

对象的哈希值

4

这张图添加了注释,展示了每个对象的哈希值是怎么在树对象里使用的。

不带名字标签的对象

5

前面的图里面的对象都带有文件名,但是实际上 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

这些哈希值都可以和图中的匹配上。

results matching ""

    No results matching ""