GIT第五讲BLOB、Commit和Tree组件

现在我们已经基本熟悉了GIT的基本操作了,接下来该执行研究一下GIT的几个比较重要的组件,GIT有四个常用的组件

  • Tag
  • Commit
  • Tree
  • BLOB

最重要的是后面的三个,Tag组件在介绍了标签之后再来说明。后三个组件管理着GIT的所有版本文件。

GIT的BLOB、Commit和Tree组件的介绍
GIT的BLOB、Commit和Tree组件的介绍

如图所示:Commit组件包含了Tree,Tree组件中又有Blob组件,那么组件究竟有什么意义,又是以什么的方式被应用了,通过具体的实例来说明,首先,初始化一个目录为GIT的Repository,之后查看一下.git目录

GIT的BLOB、Commit和Tree组件的介绍
GIT的BLOB、Commit和Tree组件的介绍

所有的组件都存储在objects文件夹中,初始化之后只会有info和pack两个文件夹,接着我们使用echo a > a.txt来创建一个文件,并且使用git add .将其提交给GIT的Stage,此时再看一下objects文件夹

GIT的BLOB、Commit和Tree组件的介绍
GIT的BLOB、Commit和Tree组件的介绍

此时多了一个f5的文件夹,里面有一个文件名很长的文件,这个文件夹就是一个blob组件,当每次把文件设置为Staged状态的时候,就会在objects中创建一个Blob组件,这里需要强调一下,GIT中每个组件都是以hash的二进制方式来存储,这个组件的名称就是文件夹名称+文件夹中的文件的名称,这个hash码是唯一的,我们刚才所创建的组件的hash码就是f5eea678d87a8664e4c76e12d3ef5c4ff775ad58,这也是组件的唯一标示。

blob组件并不会对文件信息进行存储,而是对文件的内容进行记录的,我们执行下一个操作,echo b > a.txt添加一个文件,我们把a.txt中的内容替换成b(原来是a),此时文件的状态变成Modified状态,再次通过git add .提交文件到Stage。

GIT的BLOB、Commit和Tree组件的介绍
GIT的BLOB、Commit和Tree组件的介绍

此时再观察objects目录

GIT的BLOB、Commit和Tree组件的介绍
GIT的BLOB、Commit和Tree组件的介绍

多了一个2f的目录,虽然我们的文件没有发生变化,但是内容发生了变化,此时git会再次创建一个blob组件存储到objects文件夹中,我们再次执行下一个操作echo b > b.txt该命令会创建一个新的文件b.txt,但是文件的内容和a.txt一样,然后使用git add .添加到Stage中

GIT的BLOB、Commit和Tree组件的介绍
GIT的BLOB、Commit和Tree组件的介绍

目前a.txt和b.txt都是属于Staged状态,此时再去objects文件夹中看一下。

GIT的BLOB、Commit和Tree组件的介绍
GIT的BLOB、Commit和Tree组件的介绍

并没有增加任何blob组件,因为b.txt的内容其实和a.txt一样,所以git发现这个blob已经存在了,就不会再增加新的组件。

再次强调一下blob组件是在代码提交到Stage区域的时候生成的,而且是以内容来生成一个字节码文件

我们可以通过命令git hash-object 文件名查询文件的hash码

E:\teacher\git_teacher\05>git hash-object a.txt
2fea07c1b36b55a95b543c7bd0decbd6798bf9b9

E:\teacher\git_teacher\05>git hash-object b.txt
2fea07c1b36b55a95b543c7bd0decbd6798bf9b9

我们的a.txt和b.txt是完全一样的名称,这个hash码就是我们的blob组件的名称,再去对应一下文件夹和文件夹中的文件名。

了解了blob组件只会,我们执行下面一个操作,我们把Staged中的内容提交到工厂中,提交之前请观察objects文件夹,执行git commit -m "init"之后。

GIT的BLOB、Commit和Tree组件的介绍
GIT的BLOB、Commit和Tree组件的介绍

我们会发现多了两个文件夹d6和f5,这两个文件夹究竟是什么呢?我们通过git log看一下

GIT的BLOB、Commit和Tree组件的介绍
GIT的BLOB、Commit和Tree组件的介绍

我们看到了一个commit d6297311385982c2b1552c265df08e1d07d27399,这就是我们即将要探讨的commit组件了,而后面这串hash就是这个组件的id,在git中所有的组件都是以hash来存储的,刚才讲的blob也是一样,而且都是以hash的前两位为文件夹,剩余的位数作为文件名。

commit组件在每次提交之后都会生成,当我们进行commit之后,首先会创建一个commit组件,之后把所有的文件信息创建一个tree组件,然后把Stage Area中的blob组件封装在tree中完成一次提交,我们可以通过如下命令查询commit组件

git cat-file -p d6297

cat-file可以获取这个组件的信息d6297就是组件id的缩写(只要写前面的5位git会自动找到这个组件)

GIT的BLOB、Commit和Tree组件的介绍
GIT的BLOB、Commit和Tree组件的介绍

我们会发现commit组件下有一个tree组件,依然也是用hash来作为这个tree组件的名称,之后cat-file一下这个tree组件,我们发现了最开始提交的两个blob组件,而在tree组件中记录了文件的基本信息。

现在我们应该明白git底层的运行流程了,当我们添加或者修改了文件并且add到Stage Area之后,首先会根据文件内容创建不同的blob,当进行提交之后马上创建一个tree组件把需要的blob组件添加进去,之后再封装到一个commit组件中完成本次提交。在将来进行reset的时候可以直接使用git reset --hard xxxxx可以恢复到某个特定的版本,在reset之后,git会根据这个commit组件的id快速的找到tree组件,然后根据tree找到blob组件,之后对仓库进行还原,整个过程都是以hash和二进制进行操作,所以git执行效率非常之高。

最后我们再看一个例子,我们创建一个文件夹,然后再文件夹中创建一个文件,这里希望大家跟着我的命令来思考,组件的创建情况。最后来进行验证,看看我们是否真正掌握了git的组件

mkdir test
cd test
echo hello world >> b.txt

这三个命令之后,会创建一个test的文件夹,之后再创建一个b.txt的文件,并且加入hello world这个内容,我们进行提交之后,想想会创建些什么组件?

GIT的BLOB、Commit和Tree组件的介绍
GIT的BLOB、Commit和Tree组件的介绍

由于b.txt的内容不一致,所以会创建一个blob组件,我这里是以4a开头的,之后进行提交

GIT的BLOB、Commit和Tree组件的介绍
GIT的BLOB、Commit和Tree组件的介绍

我们会发现多了三个组件,按道理来说应该只会创建一个commit组件,之后根据文件信息生成tree组件,最后把blob组件添加进去,应该只会多1个commit和1个tree,为什么会有三个呢?我们通过cat-file来进行查询

GIT的BLOB、Commit和Tree组件的介绍
GIT的BLOB、Commit和Tree组件的介绍

我们会发现首先生成了一个commit组件,这个commit中有一个tree,然后tree中处理a.txt和b.txt外还有一个tree组件,这个组件其实就是我们的文件夹,这个tree下面有新增加的b.txt的blob组件。所以我们如果新增加了一个文件夹,就会为这个文件夹创建一个tree组件。

讲到这里,我们应该已经能够了解git的这三个组件了,下一讲我们将会介绍关于git的名称的操作。

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

推荐阅读更多精彩内容

  • Blob Object 10.1中说啦,git本质是一个内容可寻址的系统,所以Git的核心就是一个 key-val...
    老沈Rosen阅读 1,344评论 0 0
  • 15分钟成为 GIT 专家 通过一步一步的实践来探索 git 内部。 Git 可能看起来像一个复杂的系统。如果上 ...
    唐先僧阅读 8,038评论 5 25
  • 众所周知,无论是实现美满的人生还是证入庄严的佛道,都离不开一个前提———在正确的道路上精进前行。 但我发现大多数人...
    释续祥阅读 371评论 0 2
  • 重庆在我的想象里是昏黄的,高低错落的,有景深的,土黄色和辣椒红是我构想的代表色。在影像和图片中见过它,不那么全面,...
    星际女战士阅读 267评论 0 1
  • 参考Android资源管理框架(Asset Manager)简要介绍和学习计划Android Resource介绍...
    合肥黑阅读 2,804评论 0 2