初始化仓库
首先在了解什么是Git对象之前,先创建一个空的文件夹test ,右键点击Git Bash Here 打开命令行窗口,在这个窗口中执行的都是Linux命令,然后执行git init 将它初始化为一个仓库,这样后续的学习操作都会在这个仓库中进行。
认识.git目录
初始化仓库后,会出现一个.git 目录,该目录保存着Git 管理仓库的所有数据和资源 这并不是.git 所有的内容,后续有跟踪文件了会再多出文件来保存暂存区的内容。解释一下上面各个目录文件的作用: hooks :包含客户端或服务端的钩子脚本 info :包含一个全局性排除文件 logs :保存日志信息 object :存储所有数据内容 refs :目录存储指向数据的提交对象的指针(分支) config :包含项目特有的配置选项 description :显示仓库的描述信息 HEAD :文件中指示了目前被检出的分支 现在看这些目录文件的作用会一头雾水,但是没关系,只要有个印象就好,随着学习的深入,会更理解这些含义。现在开始进入关于Git 对象的学习。
Git对象
Git 的核心部分是一个简单的键值对数据库。你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索该内容。现在我们先往数据库中插入数据 echo 'test git' 属于Linux命令,表示向控制台输入引号中的内容; git hash-object -w --stdin 表示向git 数据库中存储标准输入中的内容(--stdin 参数也可以换成一个文件路径),并返回该内容的哈希值,这个40位的哈希值是这个存储内容的唯一标识。 这时候我们可以打开.git/objects 目录,可以看到新增了一个目录,目录名是哈希值前2位 目录中存放着以哈希值后38位命名的文件,文件里面的内容正是我们存储的数据,只是数据已经被压缩了。 也可以通过执行find .git/objects -type f 来查看Git是如何存储数据的: 由于Git会将数据压缩再存储,所以直接打开文件查看内容会显示乱码,执行git cat-file -p 8ce43a3d893fc5bed0ecf6286f1dd7a9d43011cb 可以查看原数据:
git cat-file -p + 哈希值 可以查看哈希值存储的数据
这条被存储的数据对象就是所谓的Git对象,也可以说是数据对象。 可以执行git cat-file -t 8ce43a3d893fc5bed0ecf6286f1dd7a9d43011cb 查看Git数据中存储的数据类型: blob 是Git内部对Git对象数据类型的定义。
总结 Git对象在Git数据库中是由key: value 组成的键值对,key 是value 对应的哈希值,该键值对在git内部是一个blob类型。
接下来再操作一下对一个文件进行简单的版本控制。 首先往文件中输入内容: 将文件存入数据库 查看数据库内容,共有两个Git对象: 我们再使用vim test.txt 在test.txt 文件中添加内容: 再查看一下版本库中的数据,依旧有两条,而且查看最新的一条,内容并没有发生变化: 原因是我们并没有把修改后的文件内容再写入数据库,要再执行以下命令,返回了一个新的哈希值: 这时候数据库中有3条数据: 查看最新的存储数据: test.txt 中最新的内容已经存入了数据库。 通过这一系列的操作,表明了只要对文件进行改动,必定会有一个Git对象一一对应,即使是同个文件,也有多个Git对象,这就是该文件的多个版本。
存在的问题
- 当前所有的操作都是直接与版本库产生交互,并不涉及暂存区。
- 文件名并没有被保存,只保存了文件的内容。
- 每一条Git对象保存的都是一个文件的快照,但是项目是有多个文件的,Git对象不能保存项目的快照。
解决以上问题,就要继续学习树对象,关于树对象,再写一篇文章记录以下吧~。
|