4:Git的树对象

树对象(tree object)
它能解决文件名保存的问题,就是树对象有自己的名字,也允许我们将多个文件组织到一起。Git 以一种类似于 UNIX 文件系统的方式存储内容。所有内容均以树对象和数据对象(git 对象)的形式存储,其中树对象对应了 UNIX 中的目录项, 数据对象(git 对象)则大致上对应文件内容。一个树对象包含了一条或多条记录(每条记录含有一个指向 git 对象或者子树对象的 SHA-1 指针,以及相应的模式、类 型、文件名信息)。一个树对象也可以包含另一个树对象。

  1. 构建树对象
    首先我们可以查看暂存区的的内容:git ls-files -s ,现在都没用过,一般是空的
    然后我们可以通过这样创建一棵树:git update-index --add --cacheinfo 100644 6c2a86094b37c2af69747c0f80a6c6bccfce6fba jane.txt
    解析:
    update-index 这个命令就是向暂存区创建一个树对象,并且加入东西
    –add 因为此前该文件并不在暂存区中 首次需要—add
    –cacheinfo 因为将要添加的文件位于 Git 数据库中,而不是位于当前 目录下 所有需要—cacheinfo
    100644是一个文件模式,在Linux系统里面,每一种文件都有对应的文件模式
    100644,表明这是一个普通文件
    100755,表示一个可执行文件
    120000,表示一个符号链接
    后面就是要添加的git对象的hash值,最后就是这个树对象的名字
    在这里插入图片描述
    1我们将暂存区的内容提交后,暂存区的内容是不会清空的

2如果我们执行git update-index --add 文件名这个文件名是在工作目录里面存在的文件,这个命令就是将工作目录的文件放进暂存区里面,但是不是直接放进去的,它帮你做了两步,第一是将工作目录里面的这个文件放进版本库里面,然后将版本库里面的对应的这个文件放进暂存区里面,相当于执行了两个命令:
1git hash-object -w 文件地址
2git update-index --cacheinfo 100644 hash值 名字

3如果我们创建了两棵树,现在想将第一棵树对象加入第二棵树对象,然后生成新的树,现在暂存区保存的是第二棵树的快照,就是第二棵树的所有内容可以执行这个命令
:git read-tree --prefix=back 第一棵树的hash值
:git write-tree
read-tree是将树对象读入暂存区里面,现在生成的第三棵树里面有第二棵树的内容,也包括了第一棵树的树对象现在有三个树对象(执行了三次 write-tree),分别代表了我们想要跟踪 的不同项目快照。然而问题依旧:若想重用这些快照,你必须记住所有三个 SHA-1 哈希值。 并且,你也完全不知道是谁保存了这些快照,在什么时刻保 存的,以及为什么保存这些快照。 而以上这些,正是提交对象(commit object) 能为你保存的基本信息.
现在记得,git对象是文件的一个一个版本,树对象是项目的一个一个版本

发布了133 篇原创文章 · 获赞 37 · 访问量 4750

猜你喜欢

转载自blog.csdn.net/qq_43416157/article/details/104174167