git inside
Git是一个分布式的版本控制系统,能够完成你能想到的关于版本相关的所有事情,但是 Git 却不是那么好上手,也就是所谓的入门门槛有点高。
本文会讲什么
本文会换一个角度讲述 Git 怎么做的,给大家提供一个另外的视角,这个视角主要设计 Git 的存储,这样给大家一个更深的认识,在平时想了解的时候,也能有合适的渠道进行。
Git 是什么
这个问题看上去想一句废话,因为文章开始就说了,Git 是一个分布式的版本控制系统。那么底层又是如何实现的呢?以及其他人是怎么看待 Git 的呢?
In many ways you can just see git as a filesystem. –Linus
从上面一句话来看,Linus 把 Git 当做一个文件系统来做的,而不是一个传统意义上的版本控制系统,恰好 Git 能够做版本控制的事情。
Git 文件结构
每一个 Git 仓库中都有一个隐藏的文件夹,名字叫做 .git
这个文件夹包含了所有的文件内容,以及版本控制相关的信息,大致结构如下:
说几个大家关注的,有兴趣的可以自己打开文件看看
- HEAD 指向当前分支的最后一个 commit
- config 表示一些本项目的配置(如果没有会使用全局的配置),最明显的是 user.name 和 user.email
- hooks 表示一些钩子函数
- objects, 这里面保存的是所有的数据(也就是实实在在的内容),会是主要的内容
- refs 表示一些引用,包括分支的,远程分支的,tag 的,每一个都具体指向一个 commit
几个概念
- blob :上面的 objects 中的具体文件内容(保存的是文件内容,如果多个文件的内容一样,则只保存一份)
- tree : tree 包含 tree 或者 blob
- commit : commit 指向 tree 的根节点
- tag : 指向一个具体的 commit
- parent : 表示该 commit 从哪个 commit 演变而来
- branch : 一条 commit 的链
- HEAD : branc 的最新 commit
一个例子
假设我们有一个项目,如下图所示:
那么我们初始化后的 git 示意图应该是这样的
接着我们修改 c.txt,那么我们会得到下面的示意图
再接着我们修改 a.txt,我们就会得到下面的示意图
上面的图中灰色表示非当前版本,亮色表示当前版本,三角形代表 commit,树形表示 tree,六边形表示 blob。
总结
本文介绍了 Git 的一些基本概念,以及一个简单的示例,当然这些还远远不够了解 Git 本身的,但是我认为这些是 Git 中最基本,也是最核心的一些东西了,其他的命令大概都能够从这几个命令中得到。