git学习笔记-(5-树对象)

一,树对象

  • 树对象(tree object),它能解决文件名保存的问题,也允许我们将多个文件组织到一起。Git 以一种类似于 UNIX文件系统的方式存储内容。所有内容均以树对象和**数据对象(git 对象)**的形式存储,其中树对象对应了 UNIX 中的目录项,数据对象(git 对象)则大致上对应文件内容。一个树对象包含了一条或多条记录( 每条记录含有一个指向 git 对象或者子的 树对象的 SHA-1 指针 , 以及相应的模式、类型、文件名信息 )。一个树对象也可以包含另一个树对象。
    我们可以通过 update-index;write-tree;read-tree 等命令来构建
    树对像并塞入到暂存区。
    假设我们做了一系列操作之后得到一个树对像。
    1,新建一个仓库
    git学习笔记-(5-树对象)
    2,新建一个txt文件
    git学习笔记-(5-树对象)
    3,将创建好的txt文件写入数据库
    git学习笔记-(5-树对象)
    4,查看到此时暂存区并没有其他东西
    git学习笔记-(5-树对象)
    5,利用update-index命令为txt文件的首个版本创建一个暂存区
    git学习笔记-(5-树对象)
    6,再次查看暂存区中的内容,发现已经存入暂存区了。
    git学习笔记-(5-树对象)
    7.再查看库里面的内容,发现依旧只有原先存入库里面的txt文件,也就是说第5个命令,它并没有往库里面存东西,它只是在暂存区生成一条记录。
    git学习笔记-(5-树对象)
    8,那如果要把暂存区的内容做一个快照,放到版本库里面去。则需要用到git write-tree命令:把暂存区的内容做一个快照,放到库里面,并且返回这个树对象对应的哈希值。
    git学习笔记-(5-树对象)
    9,要查看这个树对象是不是树对象:返回结果表明确实是树对象
    git学习笔记-(5-树对象)
    10,接下来再来看库里面的内容:就已经有两条数据了,一条是原本放进去的git对象,另一条则是刚刚创建进去的树对象。git对象只存内容,而树对象则是暂存区的快照。
    git学习笔记-(5-树对象)
    也就是说,git write-tree这个命令可以等在暂存区放入足够多的文件后再执行,把暂存区的所有内容做成一个快照,也就是项目的一个版本,再放入库里面。
    换句话说,树对象代表项目的一次次版本,而git对象仅代表文件的一次次版本。
    11,此时我们已经把暂存区的内容做成快照放到库里面了,再来看看暂存区里面有什么?
    git学习笔记-(5-树对象)
    这个git对象依旧存在这里,也就是说,把暂存区的内容做成快照放入库里面之后,暂存区的内容并不会清空。

2-1,再创建一个txt文件
git学习笔记-(5-树对象)
2-2,现在它是独立的文件,要想纳入git管理,则需要先保存到库里面,生成哈希值,才纳入git管理。
git学习笔记-(5-树对象)
2-3,再来看库里面,加上1中做的,应该有三个东西了。
git学习笔记-(5-树对象)
2-4,查看test.txt的版本
git学习笔记-(5-树对象)
2-5,想把它内容中的版本变成2
git学习笔记-(5-树对象)
按i进入编辑模式,修改完毕后按ESC退出编辑模式,按:wq退出
再查看文本内容:
git学习笔记-(5-树对象)
现在我们更改了,工作区中test.txt的文本内容。
再看看库里面的修改了没有。
要注意区分linux命令和git命令,前面不加git的基本是l命令,也就说cat test.txt查看的是工作区中test.txt文本的内容。
而git cat-file -p 哈希值,则是查看库里面test.txt的文本内容,因为它已经纳入git管理了,所以需要用git命令来查看内容。
git学习笔记-(5-树对象)
由上两图可以知道,此时仅仅是工作区中的test.txt文件被修改了,但是库中的test.txt文件还没有被修改。需要把工作区中最新的test.txt文件再次存入库中:
2-6,这样,又会生成一个新的git对象,也就是返回一个新的哈希值。
git学习笔记-(5-树对象)

于是库里面就会产生3个git对象和一个树对象。
git学习笔记-(5-树对象)
git学习笔记-(5-树对象)
如果此时修改完毕了,想要做成一个新的版本,则先要把修改好的内容依次存入暂存区。
2-7,将修改好的test.txt文件从库中存放到暂存区。
git学习笔记-(5-树对象)
这条代码一旦执行,缓存区中的test.txt会被覆盖城成最新的(哈希值变成最新的了)
git学习笔记-(5-树对象)
2-8,再把创建好的new.txt文件对应的git对象存入暂存区,但是因为new.txt在缓存区中是没有旧版本的,所以要加add:
git学习笔记-(5-树对象)
这样一来,暂存区中就会有两个最新的文件了:
git学习笔记-(5-树对象)
也就是说,暂存区的覆盖是按文件名来的,已经有旧版本的话,就覆盖,没有旧版本的话,就新加入。
此时,暂存区的文件状态和我工作目录重的文件状态是一致的了,可以当作一个版本了。
2-9,把暂存区的内容做成一个快照,保存到库,以生成一个新的版本(树对象)
git学习笔记-(5-树对象)
于是库里面就会产生两个树对象(第一版本和第二版本)
git学习笔记-(5-树对象)

二,对应的命令操作

git学习笔记-(5-树对象)
git学习笔记-(5-树对象)
git学习笔记-(5-树对象)

三,大致思路

git学习笔记-(5-树对象)