Git底层原理

    git本质上是一个内容寻址的文件系统,并在此基础上提供了一个版本控制系统的界面。

    一个已经初始化后的git目录结构如图:

git目录结构

其中我们需要重点关注以下四个文件:

1. HEAD:保存了当前被检出的分支

2. objects:存储所有的数据内容

3. index:存储暂存区信息

4. refs:存储指向commit对象的指针


1. Git对象

    objects目录下存储了git中所有的数据对象,其目录结构如下:

objects                                                                                                                                    0d                                                                             7f012a2181ab54c95b4078674da7b31b580bff                                                              1c                                                                                     c469fe42468071e2b1823650fb0a3206985281

    objects目录中存储的对象拥有一个40位的id,其中前2位作为文件夹名,后38位作为文件名,文件内容即为该对象的值。git中拥有四种对象类型:blob,tree,commit和tag。

1.1 blob对象

    blob对象存储了用户工作区域内的文件内容。当执行git add命令时,objects下会生成新的blob对象,保存了add命令的文件内容。

    使用git cat-file命令可以从指定的对象中取得数据,加上-p选项

    git构造一个对象时,首先添加一个header,header以对象类型开头。下面的例子时git构造了一个内容为字符串"blob",类型为blob的对象。header首先以blob开头,然后添加一个空格,随后是数据内容的长度,最后是一个空字节。因此一个blob对象包含一个blob header和原始数据内容,其形式如下:

>> header = "blob #{content.length}\0"

=> "blob 16\u0000"

    Git会将上述header和原始数据内容为这个blob对象计算出SHA-1校验和。此SHA-1校验和就是前文所说的40位长度的对象id。然后git根据此id值确定此对象的存储位置(前2位作为文件夹,后38位作为文件名),使用zlib压缩此blob对象然后存储到相应位置。

    commit对象,tree对象的文件header则以"commit"和"tree"开头。

1.2 tree对象

    tree对象,顾名思义是一棵树,它的每个节点被称为tree entry。每个tree entry有一个指向blob对象或子树对象的SHA-1指针,以及相应的模式,类型,文件名信息等。例如,某个tree对象的信息如下:

tree对象

    每一行代表此tree对象的一个节点,即tree entry。第一列代表文件模式,其中040000表示这是一个目录,而100644表示这时一个普通文件。第二列表示此节点的对象类型。第三类是此节点的对象SHA-1值,通过此SHA-1值来定位数据内容,可以通过git cat-file -p <SHA-1>来查看。第四列则代表了文件名。因此,此tree对象的树形结构图如下:

tree对象

tree对象同blob对象一样,拥有一个SHA-1值,并且通过SHA-1值来确定文件位置,并将添加了header的tree对象内容写入到objects目录下。

1.3 commit对象

    一个commit对象保存了一次commit的信息,包括作者,提交注释,并且指向父commit对象和一个tree对象。这个tree对象是当前项目快照。如图所示:

commit对象

2. 再谈git文件夹结构

2.1 index文件

    index文件实际上就代表了git中暂存区。它存储了一个tree对象,表示当前项目的快照。当运行git add命令时,首先在objects目录下生成一个新的blob对象,然后更新index文件中的tree对象。

    当运行git status命令时,git会对比工作区和暂存区的文件,具体流程如下:

1. 首先比较文件的时间戳和长度,如果相同则认为文件没有改变。

2. 如果发现时间戳不同,则比较文件内容,如果内容相同,则将工作区文件的时间戳更新到index文件(暂存区)中。

3. 如果工作区文件和暂存区文件内容不相同,则提示有changes

    当运行git commit命令时,首先使用index文件中tree对象在objects目录下创建一个tree对象,然后在objects目录下创建一个commit对象,commit对象指向此tree对象以及父commit对象,最后更新.git/refs/heads/master(commit时的分支名)文件内容为此commit的SHA-1值。

2.2 refs文件夹

    refs文件夹结构如下:

refs文件夹结构

    其中子文件夹heads目录为每一个分支创建了一个文件,文件中只保存了在该分支下最近一次提交的commit id。

refs/heads文件夹结构

    打开master文件,内容只是一个commit的SHA-1值。

master文件内容

2.3 HEAD文件

    HEAD文件指向当前活跃的分支。打开HEAD文件,文件内容如下:

HEAD文件内容

    可以看到文件内容是本地的某一个代表了feture2分支的文件,而该分支文件的内容是最近的一次commit id。因此,我们常用的命令诸如 git reset HEAD等命令中出现的HEAD,能够正确的定位到具体的commit。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容