浅谈Git的内部原理
前言
首先提前预祝各位同学元旦快乐,接下来进入正题。身为程序员的大家都知道,做技术一定知其然知其所以然,很多人都会用Git,但却对Git的原理却不是很了解,接下来带领大家简单的探秘下Git的原理。
Git目录结构
我们都知道无论是通过git init初始化,还是clone下来的一个工程,里面都会存在一个.git的隐藏文件。这个.git目录下也就是实现Git功能的相关文件。之所以设置为隐藏文件,也就是Git官方不想让用户操作这个文件。进入.git目录后,如图所示:
HEAD:Git仓库处于哪个分支。
config:当前Git仓库的配置和一些项目特有的配置。git remote add 添加的远程分支信息就保存在这里。
description:仅供GitWeb程序使用。
hooks:该目录用于配置客户端提交操作用于出发服务端的脚本,一般用于自动化部署。
info:该目录用于配置一些不希望被Git管控的文件。
objects:该目录用于存储所有数据对象内容。
refs:用存储Git本地以及远程分支的引用。
其实这里面还有文件Index,由于是个空仓库且暂存区里面没用内容,所以并没有Index生成。Index文件用于存储暂存区信息。
Git存储
Git是一个内容寻址文件系统,其核心部分就是一个简单的键值对数据库,可以向该数据库插入任何内容,会返回一个40位的字符串键,通过这个40位字符串可以在检索出插入的内容。
这里简单的介绍下什么内容寻址,其实就是通过SHA-1算法生成一个长度为40个字符的校验和,其实也就是key,然后根据这个key去得到文件内容,这种通过唯一标识key去获取我们的内容的操作就是内容寻址。
Git对象
在Git中有四种对象:
blob是具体的文件对象
tree是某个时刻提交目录的内容
commit执行一次commit就会产生一个commit对象
tag可以理解成commit的别名,一个tag对应一个commit
在Git的对象需要使用如下命令进行查看:
git cat-file-p对象hash值 查看对象的内容
git cat-file -t 对象hash值 查看对象的类型
git ls-files --stage 查看index文件内容
git hash-object 查看文件的hash值
首选创建一个test.txt文件,并提交到暂存区。通过git ls-files --stage查看index内容:
我们可以通过git cat-file -t e69de29bb2d1d6434b8b29ae775ad8c2e48c5391查看对象类型,如图是类型是blob。
然后我们在将暂存区的test.txt提交到本地仓库,并查看提交记录。
通过git cat-file -p commitid查看我们提交的内容。如图所示,是一个tree对象。
因此我们将一个本地文件提交到本地仓库,会产生一个blob对象、一个commit对象,一个tree对象。那么tag对象呢?别急,继续!
我们通过命令git tag -a tag1.0 -m "add tag"将上面的commit创建一个标签。在我们.git/refs/tags/目录下会新增一个tag文件,且内容是一个tag对象如图:
以上只是简单的说下Git的内部原理,感兴趣的同学想深入了解Git也可以参考Git官方文档:https://git-scm.com/book/zh/v2/
参考文献:
1、 https://git-scm.com/book/zh/v2/
2、 https://blog.csdn.net/haogangshang/article/details/88291045
3、 https://blog.csdn.net/ljk126wy/article/details/101064186
4、 https://www.cnblogs.com/jasongrass/p/10582449.html