08 February 2017
号外号外:专注于移动端的fullPage.js来啦!!!快点我查看

这是起底Git系列的第三篇,本篇我们来介绍一下Git的内部工作原理。

What is Git?

你可能听说过Git是版本控制系统、微型文件系统、内容寻址系统。Git的底层是一个微型内容寻址系统Git在1.5版本是一个分水岭,1.5之前更偏向文件系统,1.5版本后更偏向版本控制系统

Git常用命令共有30多个,可运行git help查看;但Git总共有130多个命令,可以通过git help -a查看,这些命令可以分为高层命令和底层命令,底层命令被设计成unix风格,不常用

Git仓库下有一个.git目录,里面存储了git全部的秘密,一般包括下面的内容:

  • config
  • index
  • HEAD
  • hooks/
  • logs/
  • refs/
  • objects/

下面会详细介绍没个部分都是什么

config

config是仓库的配置文件,一个典型的配置文件如下,我们创建的远端,分支都在配置文件里有表现; fetch操作的行为也是在这里配置的

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
[remote "origin"]
    url = git@github.com:yanhaijing/zepto.fullpage.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "dev"]
    remote = origin
    merge = refs/heads/dev

objects

git通过一种算法可以得到任意文件的指纹(40位16进制数字),然后通过文件指纹存取数据,存取的数据都位于objects目录

objects目录下有3种类型的数据:

  • Blob
  • Tree
  • Commit

文件都被存储为blob类型的文件,可以通过内部命令hash-object写入数据

echo 'test content' | git hash-object -w --stdin
d670460b4b4aece5915caf5c68d12f560a9fe3e4

然后通过cat-file取出数据

$ git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4
test content

文件夹被存储为tree类型的文件,文件内容如下所示

git cat-file -p 99f1a6d12cb4b6f19c8655fca46c3ecf317074e0
100644 blob 47c6340d6459e05787f644c2447d2595f5d3a54b      simplegit.rb

一般我们系统中的目录,在git中会像下面这样存储

创建的提交节点被存储为commit类型数据,commit文件的内容如下

$ git cat-file -p fdf4fc3
tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579
author Scott Chacon <schacon@gmail.com> 1243040974 -0700
committer Scott Chacon <schacon@gmail.com> 1243040974 -0700

first commit

有三个提交的Git仓库可简化为下图所示

refs

refs目录存储都是引用文件,如本地分支,远端分支,标签等

  • refs/heads/xxx 本地分支
  • refs/remotes/origin/xxx 远端分支
  • refs/tags/xxx 本地tag

引用文件的内容都是40位commit

上面只有提交的图补上分支后,如下所示

HEAD文件存储的是当前所在的位置,其内容可以使分支名字,40位commit ID

$ cat HEAD
refs/heads/master

上面的图补上HEAD后,如下所示:

总结

如果你有任何疑问的话,欢迎留言讨论;如果本系列文章对你有帮助的话,那我很荣幸,别忘了打赏哦,O(∩_∩)O哈哈~

最后感谢你的阅读,O(∩_∩)O哈哈~

继续学习

原文网址:http://yanhaijing.com/git/2017/02/08/deep-git-3/

欢迎订阅我的微信公众帐号,只推送原创文字。扫码或搜索:颜海镜
微信公众号:颜海镜


开发者头条

开发者头条 on 10 Feb 2017

感谢分享!已推荐到《开发者头条》:https //toutiao.io/posts/zig8v4 欢迎点赞支持!
欢迎订阅《PHP头条》https //toutiao.io/subjects/1229

颜海镜

颜海镜 on 10 Feb 2017

好的,感谢

宋光宇

宋光宇 on 10 Feb 2017

有点猝不及防的就结束了,内容很优秀 嘻嘻

颜海镜

颜海镜 on 12 Feb 2017

感谢阅读,感谢提出宝贵意见

王龙天

王龙天 on 01 Mar 2017

跟着颜大大的思路写了一个辅助理解的工具:

https //github.com/wyvernnot/git-internals

颜海镜

颜海镜 on 02 Mar 2017

太棒了,我也搞了一个类似的工具,只是没开源

前端小武

前端小武 on 02 Mar 2017

兔子

颜海镜

颜海镜 on 04 Mar 2017

好基友

BiggerHeader

BiggerHeader on 15 Jul 2017

写的 不错,请问你在哪了解到这些原理的???总感觉自己了解得很肤浅。

yanhaijing

yanhaijing on 17 Jul 2017

@BiggerHeader 其实progit这本书里面有很多介绍,zhu主要来自这本书,也有一些来自其他地方,我在开篇里面写了参考资料