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 这个文件夹包含了所有的文件内容,以及版本控制相关的信息,大致结构如下:

file_tree.png

说几个大家关注的,有兴趣的可以自己打开文件看看

  1. HEAD 指向当前分支的最后一个 commit
  2. config 表示一些本项目的配置(如果没有会使用全局的配置),最明显的是 user.name 和 user.email
  3. hooks 表示一些钩子函数
  4. objects, 这里面保存的是所有的数据(也就是实实在在的内容),会是主要的内容
  5. refs 表示一些引用,包括分支的,远程分支的,tag 的,每一个都具体指向一个 commit

几个概念

  1. blob :上面的 objects 中的具体文件内容(保存的是文件内容,如果多个文件的内容一样,则只保存一份)
  2. tree : tree 包含 tree 或者 blob
  3. commit : commit 指向 tree 的根节点
  4. tag : 指向一个具体的 commit
  5. parent : 表示该 commit 从哪个 commit 演变而来
  6. branch : 一条 commit 的链
  7. HEAD : branc 的最新 commit

一个例子

假设我们有一个项目,如下图所示:

project.png

那么我们初始化后的 git 示意图应该是这样的

first_version.png

接着我们修改 c.txt,那么我们会得到下面的示意图

second_version.png

再接着我们修改 a.txt,我们就会得到下面的示意图

third_version.png

上面的图中灰色表示非当前版本,亮色表示当前版本,三角形代表 commit,树形表示 tree,六边形表示 blob。

总结

本文介绍了 Git 的一些基本概念,以及一个简单的示例,当然这些还远远不够了解 Git 本身的,但是我认为这些是 Git 中最基本,也是最核心的一些东西了,其他的命令大概都能够从这几个命令中得到。

Comments