Git存储原理——Git对象

初始化仓库

首先在了解什么是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组成的键值对,keyvalue对应的哈希值,该键值对在git内部是一个blob类型。

接下来再操作一下对一个文件进行简单的版本控制。
首先往文件中输入内容:
在这里插入图片描述
将文件存入数据库
在这里插入图片描述
查看数据库内容,共有两个Git对象:
在这里插入图片描述
我们再使用vim test.txttest.txt文件中添加内容:
在这里插入图片描述
再查看一下版本库中的数据,依旧有两条,而且查看最新的一条,内容并没有发生变化:
在这里插入图片描述
原因是我们并没有把修改后的文件内容再写入数据库,要再执行以下命令,返回了一个新的哈希值:
在这里插入图片描述
这时候数据库中有3条数据:
在这里插入图片描述
查看最新的存储数据:
在这里插入图片描述
test.txt中最新的内容已经存入了数据库。
通过这一系列的操作,表明了只要对文件进行改动,必定会有一个Git对象一一对应,即使是同个文件,也有多个Git对象,这就是该文件的多个版本。

存在的问题
  • 当前所有的操作都是直接与版本库产生交互,并不涉及暂存区。
  • 文件名并没有被保存,只保存了文件的内容。
  • 每一条Git对象保存的都是一个文件的快照,但是项目是有多个文件的,Git对象不能保存项目的快照。

解决以上问题,就要继续学习树对象,关于树对象,再写一篇文章记录以下吧~。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值