定义
它能解决文件名保存的问题,也允许我们多个文件组织到一起。Git以一种类似于Unix文件系统的方式存储内容。所有内容均以树对象和数据对象(GIt对象)的形式存储。一个树对象可以去包含另一个树对象。
构建树对象
git update-index --add --cacheinfo 10064 hash值
--add 此前并不在缓存区中,首次加入必须要 --add
--cacheinfo 因为将要添加的文件在Git数据库,而不是在当前目录下,所以需要--cacheinfo
- 文件模式
100644,表明这是一个普通文件;
100755,表示一个可执行文件;
120000,表示一个符号链接。
保存f1并生成hash值
为暂存区生成快照并保存到objects
git write-tree
查看生成的类型
tree被保存到数据库
查看暂存区
git ls-files -s
更新f1 存储f2
更新f1后存储,生成新的hash值
存储f2为git对象
当前所有数据
$ find .git/objects/ -type f
.git/objects/44/d5f699a169f26bb2bf69cea5a4431cc7a9d2cd tree对象
.git/objects/93/60a366d14fafd4afc4a8bb2a21a01f54c97dd0 f1的1st版本,git对象
.git/objects/dc/d5456019f4470e5b781702c62271cccb8e8657 f2的首个版本,git对象
.git/objects/f0/b1c0b15065a57025bfd1f1df5c7a035e0f8c1a f1的2nd版本,git对象
再次构建树对象
将 修改后的 f1 存放如 暂存区,查看后发现,f1.txt 在缓存区的原有版本被覆盖
将f2.txt对应的git对象,从数据库加入到缓存区,并查看缓存区内容
生成树对象,查看数据库
.git/objects/1b/cca78c04af12b10e4a2ef6c680dc9a4196a7eb 树对象的第二个版本
.git/objects/44/d5f699a169f26bb2bf69cea5a4431cc7a9d2cd 树对象首个版
.git/objects/93/60a366d14fafd4afc4a8bb2a21a01f54c97dd0 f1.txt的第一个版本
.git/objects/dc/d5456019f4470e5b781702c62271cccb8e8657 f2.txt首个版本
.git/objects/f0/b1c0b15065a57025bfd1f1df5c7a035e0f8c1a f1.txt第二个版本
构建第三棵树
git read-tree --prefix=bak 树对象hash值
生成新的tree对象
git write-tree
查看当前数据库对象数,数量+1,到达6
提交树
提交树,并附加提交的备注信息
echo 'description of commit info' | git commit-tree 缓存区树的hash值
二次提交对象
-p 指明此次提交的对象的父对象