08 February 2017
号外号外:我的新书《现代JavaScript库开发:原理、技术与实战》出版啦!!!快点我查看
号外号外:一组小而美的JavaScript迷你库!!!快点我查看
号外号外:猿辅导招聘前端,后端,客户端啦!地点:北京!!!快点我查看

这是起底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/

微信公众号:颜海镜
关注微信公众号 颜海镜
微信支付二维码
赞赏支持 微信扫一扫