Git学习-底层原理浅析

Git学习

讲解git基本知识,包括.git目录,git add/commit底层原理

认识.git目录

首先我们初始化一个git目录作为我们研究的对象。

git init初始化git目录,如下图
Git学习-底层原理浅析_第1张图片
重点关注以下几个:

  • config文件,保存一些配置信息,这一点不做讲解
  • info目录,内部包含一个exclue文件,使用方式和.gitignore一致
  • hooks目录,包含一些钩子脚本,可以看作是触发器,这一点不讲解
  • HEAD文件,其内容是当前分支的路径名,如下图:

Git学习-底层原理浅析_第2张图片
其中master文件中,保存了最新的SHA值,指向最新提交的数据

  • refs文件,里面是包含两个文件夹heads和tags。至于有什么作用,后续会提到。[遗留问题1]()
  • objects目录,存储数据信息。
  • index文件,指向待提交数据

好了,结合.git的目录结构,让我们更好的了解git add/commit以及对应的重置(撤销操作)git reset。如下图:
Git学习-底层原理浅析_第3张图片
上面讲到index如何与待提交数据联系?HEAD中指向文件保存的SHA指向最新一次提交的数据,究竟SHA值和数据是如何关联的呢?且往下看。

原理浅析

index文件浅析

首先来看index如何与待提交数据联系?这个问题,首先在仓库里新增一个文件,并执行git add操作,如下图,很遗憾乱码,不过git有些底层命令可以让我们读取index
Git学习-底层原理浅析_第4张图片
上面讲到看到SHA如何关联数据的,SHA是如何产生的呢?objects中文件又是如何产生的呢?简单讲SHA = SHA-1(文件类型+文件长度+文件内容) ,而objects中的文件是将原始文件进行压缩,保存到SHA值对应的文件下,取SHA值的前两个字符作为目录,后面38个字符作为文件名。


HEAD文件浅析

首先读取HEAD文件,看下有什么?如下图6
Git学习-底层原理浅析_第5张图片
如上图所示,这个SHA对应一个文件,该文件存储的数据类型是commit类型(git cat-file -t命令查询)。其内容包含几点内容:

  • 指出该提交的相关信息,提交信息,提交人等等
  • 又出现了一个tree类型数据以及该数据SHA值

相同的操作,我们再看下这个SHA值。如下图
git基础9.png
可以看到master保存SHA发生变化,这个可以理解,master文件理应保存最新一次的提交。读取这个SHA发现里面多了一个parent 指向上一次提交

总结来看,可以有下图来表述:
Git学习-底层原理浅析_第6张图片
其实分支的本质就是一个commit类型数据,通过其内部的信息指向真实数据。


结合上面的知识,我们看一下git gc,如下图:
Git学习-底层原理浅析_第7张图片
可以看到b042a6大小是22054字节,而033b44只有9个字节,同时会引用b042a6相同部分。


总结

其实可以把git抽象成一个文件管理器,每次提交代表新建一个文件夹,文件夹包含着提交的数据。同时维护一个链表,链表中的节点保存着新建文件夹(进行提交)时的相关信息,比如新建的文件夹名称等(提交时间、提交信息,SHA值),当然这个链表可以分叉(新建分支),可以重合(归并)。

参考

  1. Pro Git(中文版)

你可能感兴趣的:(git)