git包含四种对象文件:html
粗略一看,能够大体感受出blob相似于文件,而tree相似于文件夹,而commit则是囊括这一大堆东西的一个对象。git
SHA-1算法具体怎么计算,能够自行google。这里只说一下该算法在git数据存储中的应用。咱们能够用git提供的命令来计算一个文件的SHA-1值:github
echo 'test content' | git hash-object --stdin d670460b4b4aece5915caf5c68d12f560a9fe3e4
输入字符串 "test content",git会经过SHA-1算法将其中的内容计算出一个40个字符的HASH值。算法
一样地,若是咱们在工做区新增一个文件,而后经过 git add
加入到暂存区,那么git一样地会根据这个文件经过SHA-1算法来计算出属于该文件的一个HASH值。bash
这个值是惟一的!若是一个文件通过修改以后,再次计算获得的HASH值会不会和原来的同样?答案是确定不会的,因此这个HASH值就能够充当一个标识符的做用。ui
对于blob对象,仔细观察上一副图能够发现,blob对象的头顶都有着5个字符,"5b1b3","911e7","cba0a"。其实这一段字符串就是所属文件的HASH值的一部分。google
那么它为何会出如今blob的头顶呢?其实当把一个新的文件放入到暂存区以后,git就在本身的目录下 .git/object/
新建了一个文件对象,来保存新加入的文件,编码
与此同时经过SHA-1算法来计算获得一个所属该对象的"标识",而这个对象,就是blob对象。(感受说的有点拗口)。大体过程以下图:spa
没错,又多出了两个hash值,即表明了两个对象。同时考虑到上边那个关系图能够大体猜想到,提交以后,又生成了两个对象,一个tree对象,一个commit对象。.net
不过若是继续带着好奇心深刻下去,尝试着去打开其中的一个文件,会发现里边是一堆16进制的数字,即便用Winhex打开,也是乱码。这是由于git对原来文本中的数据进行了从新压缩编码,这样既能够保存原来的文本内容,又减小了对空间的占用。
提到指针,那就确定要稍微提一下C、C++中的指针了。这种指针的做用很简单,就是存储一个变量的地址,而后根据这个地址来找到该对象,进而对其进行操做。
那么,git中的指针也是这样的吗?其实,也差很少。只不过这里存储的并非变量的在内存上的地址,而是另一种形式的"地址",这就是HASH值。
没错,就是上边计算出来的那个HASH值,commit对象的HASH值。
在上副图中,我对Doge.txt文件又进行了修改,而后又放入到暂存区中,接着进行commit提交操做,而后输入命令 git log
来查看全部提交的日志记录,咱们能够看到有一排黄色的字符串,写着 commit cbfa20cb4fc205477237d3ffc88909f7cb49bd6f
,这就是咱们次此提交以后生成的commit对象的HASH值。那么,指针在哪里呢?不急,接下来看下边这幅图:
这个文件是master文件,在 .git/refs/
目录下。为何要看这个文件呢?咱们在用git的时候,常常会看到master这个单词,它是git中默认的一个分支,简单点说这个master文件就是一个指针,这个指针记录着一个commit提交对象的HASH值,经过这个HASH值咱们就能够找到本次提交的tree对象、blob对象,这样也就找到了咱们提交的文本信息了。
回顾一下咱们刚才走过的路,咱们知道一次提交就对应着个commit对象,一个commit对象还带着一个惟一标识的HASH值,那么按照这样的逻辑来推理的话,两次提交就有会两个commit对象,两个不一样的HASH值。若是要版本回退的话,是否是咱们只要指定一下回退到第几个版本,而后得到相应的commit对象就能够作到了?先来简单地试验一下吧:
图中有两行数据,同时在本地版本库中也有两个版本
上边是一个简单的版本回退示意图,经过输入命令 git reset 版本id
来回退到指定的版本。其实一个最简单的版本回退就是如此。
其实在内部,就是将带有HASH值的HEAD指针从最新的一个提交对象上转移到上一个提交对象上。
对于版本回退,还有许多其余的用法,包括reset的一些参数使用,checkout、revert命令的使用。有关它们的具体用法请戳这个传送门:
代码回滚:Reset、Checkout、Revert的选择
这篇文章重点不是介绍git的命令用法,而是对其内部原理的一个简单分析。我写的比较白话,并且一直感受有些地方不够完善,详略不太得当,但也没考虑好怎么去修改、完善。但愿本身在之后的不断回看中,可以逐渐完善。
Git 工做区、暂存区和版本库
使用原理视角看 Git
《Pro Git》的笔记-git内部原理
Git 用起来 の 基本原理
https://www.jianshu.com/p/9291dd3a99b3 深刻git数据存储原理
做者:雅俗共赏M连接:https://www.jianshu.com/p/9291dd3a99b3來源:简书简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。