本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一块儿天天进步一点点git
树对象主要解决2个问题,:文件名的保存和文件目录关系的保存数据库
就像下面这样bash
下面咱们就来模拟一下构建上面这颗树,也就是模拟保存这3个文件,其中的"bak"是一个目录,下面有一个文件微信
首先能够看到,咱们一共须要保存的是3个文件,new.txt 、 内容为version 2的 test.txt 和内容为version 1的 test.txt。其中咱们上面已经把version 1的 test.txt写入到Git仓库了。markdown
Git是怎么建立树对象的呢?spa
Git 根据某一时刻暂存区(即 index 区域)所表示的状态建立并记录一个对应的树对象,如此重复即可依次记录(某个时间段内)一系列的树对象。而暂存区里保存就是咱们add进去的文件和目录。3d
而咱们以前的text.txt是直接存入到Git数据库里面了,没有在暂存区,因此先要把这个文件读到暂存区里来code
咱们能够用 update-index 命令更新暂存区(跟咱们作git add
操做是同样的道理)orm
git update-index --add --cacheinfo 100644 83baae61804e65cc73a7201a7252750c76066a30 test.txt
复制代码
100755
,表示一个可执行文件;120000
,表示一个符号连接好的,如今咱们已经把前面的内容更新到暂存区了。对象
而后咱们就能够用 write-tree 命令生成一个树对象
git write-tree //输出 d8329fc1cc938780ffdd9f94e0d364e0ea74f579 复制代码
咱们能够验证一下它确实是一个树对象(git cat-file -t命令能够查看对象的类型):
git cat-file -t d8329fc1cc938780ffdd9f94e0d364e0ea74f579 //输出 tree 复制代码
通过上面的步骤,咱们就把右边的那个树对象建立完毕了。
实际上,上面已经解决了一个问题,就是文件名的保存。
git cat-file -p d8329fc1cc938780ffdd9f94e0d364e0ea74f579 //输出 100644 blob 83baae61804e65cc73a7201a7252750c76066a30 test.txt 复制代码
这里咱们再快速建立剩下的部分,直接新建new.txt
和更新text.txt
,而后用git add
添加到暂存区并生成一个新的树对象
echo 'new file' > new.txt echo 'version 2'> text.txt git add . git write-tree 复制代码
下面咱们来看看怎么解决目录保存的问题,也就是树和树关联起来
//首先把前面的把那个树对象写入到暂存区,其中bak就表示目录名 git read-tree --prefix=bak d8329fc1cc938780ffdd9f94e0d364e0ea74f579 //而后生成一个新的树对象 git write-tree //输出 9f2f42e85a6648e5b5f48e1a6f154999e06b9a31 复制代码
而后咱们就能够来看看这个新的树对象了:
git cat-file -p 9f2f42e85a6648e5b5f48e1a6f154999e06b9a31 //输出 040000 tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579 bak 100644 blob fa49b077972391ad58037050f2a75f74e3671e92 new.txt 100644 blob 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a text.txt 复制代码
能够看到,目录就对应一个树对象,这样保存目录的问题就解决了。
数据对象和树对象用于保存数据和文件名和目录,咱们还须要记录是谁保存的这些数据以及时间和缘由等信息,而这些信息就须要第三个对象——提交对象。下一次咱们就来看看提交对象
欢迎关注个人公众号查看更多精彩文章!
复制代码