初始化仓库
首先在了解什么是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对象不能保存项目的快照。
解决以上问题,就要继续学习树对象,关于树对象,再写一篇文章记录以下吧~。