什么是树对象
树对象能解决文件名保存的问题,也允许我们将多个文件组织到一起。Git 以一种类似于 UNIX 文件系统的方式存储内容。所有内容均以树对象和数据对象(git 对象)的形式存储,其中树对象对应了 UNIX 中的目录项,数据对象(git 对象)则大致上对应文件内容。一个树对象包含了一条或多条记录,一个树对象也可以包含另一个树对象。
构建树对象
可以通过 update-index;write-tree
等命令来构建树对像并塞入到暂存区。
为了演示树对象的构建,我们先准备一个空的git仓库,然后准备一个test.txt
文件并创建该文件的一个git对象:
执行git update-index --add --cacheinfo 100644 fbb2ff04e2cae17293a83c5e83af505f62cd13d1 test.txt
为test.txt
创建首个版本,并放到暂存区。由于项目中只有这个文件,因此也是项目的首个版本。
命令解释:
update-index:为项目版本创建暂存区;
–add:因为此前该文件并不在暂存区中,首次需要--add
;
cacheinfo:因为将要添加的文件位于Git数据库中,而不是位于当前目录下,需要--caheinfo
;
100644:Linux系统对文件模式有一个标识
- 100644:表明这是一个普通文件
- 100755:表示一个可执行文件
- 120000:表示一个符号连接
哈希值后面的参数就是对哈希值对应的文件的命名。
执行git ls-files -s
查看暂存区的内容
文件已经被添加进暂存区了。
再查看一下版本库,
版本库中存的这个哈希值是执行git hash-object
所生成的git对象,也就是说update-index
只是把该git对象命了名(test.txt)并把它放进暂存区,没有跟版本库有交互。
write-tree
接下来介绍一下git write-tree
,该命令的作用是将暂存区做一个快照,给暂存区生成一个树对象,并放入到版本库。
返回了一个哈希值,查看该哈希值类型
结果显示是一个树类型,也就是说该哈希代表的是一个树对象。查看版本库:
版本库中新增了刚生成的树对象。
再次查看暂存区
也就是说write-tree
把暂存区中的数据写入到版本库中并不会清空暂存区中的内容。
实际上可以多次在暂存区中存放项目快照,最后一并执行git write-tree
把这个项目快照存到版本库,这个项目快照代表的项目的一个版本。
之前演示的是只有一个文件的项目,再演示有多个文件的项目。
创建一个dog.txt
文件,一如既往地先生成git对象
现在版本库中存的是test.txt
第一个版本的git对象、项目第一个版本的树对象、和dog.txt
第一个版本的git对象。我们再创建test.txt
的第二个版本,修改test.txt
文件
生成git对象
此时已经准备好了项目的第二个版本(第一个版本是新增了test.txt文件,第二个版本新增了dog.txt文件并修改了test.txt文件),再把这两个文件添加进暂存区
生成项目第二个版本的树对象
版本中已经有了项目的第二个版本。
总的来说,git对象存储的只是一个文件的版本,树对象存储的是一个项目的版本。