文档章节

Git组件BLOB、Commit和Tree组件

pmos
 pmos
发布于 2017/01/05 22:20
字数 1677
阅读 173
收藏 1

Git有四个常用的组件:

  • Tag
  • Commit
  • Tree
  • BLOB

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

如图所示:Commit组件包含了Tree,Tree组件中又有Blob组件,那么组件究竟有什么意义,又是以什么的方式被应用了,通过具体的实例来说明。

1、首先,初始化一个目录为GIT的Repository,之后查看一下.git目录:

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

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

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

此时再观察objects目录:

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

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

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

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

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

D:\test\git>git hash-object a.txt
2fea07c1b36b55a95b543c7bd0decbd6798bf9b9

D:\test\git>git hash-object b.txt
2fea07c1b36b55a95b543c7bd0decbd6798bf9b9

D:\test\git>

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

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

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

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

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

git cat-file -p 95f70

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

我们会发现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 > c.txt

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

由于c.txt的内容不一致,所以会创建一个blob组件,我这里是以4a开头的:

之后进行提交:

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

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

© 著作权归作者所有

pmos
粉丝 12
博文 128
码字总数 213147
作品 0
其它
项目经理
私信 提问
版本控制工具——Git常用操作(下)

本文由云+社区发表 作者:工程师小熊 摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复现场的操作...

腾讯云加社区
03/08
710
1
想晋级高级工程师只知道表面是不够的!Git内部原理介绍

本文由云+社区发表 作者:腾讯工蜂用户:王二卫 从不一样的视角了解git,以便更好的使用git 一、git & git 版本库认识 git 是一个内容寻址的文件系统,其核心部分是一个简单的键值对数据库(...

腾讯云加社区
01/18
16
0
GitPython git python 的开发库

工程地址: https://pypi.python.org/pypi/GitPython/需要安装先安装: gitdb https://pypi.python.org/pypi/gitdbGitPython使用模块对象访问git配置库。仓库操作 数据库对象 GitDB GitCmdObje...

蓝桥书生
2013/06/28
9.6K
9
GIT科普系列5:index in git

背景: git的使用其实没有想象中的那么复杂,平日里真正使用的指令都是极少数、最简单格式的。之所以使用过程中感觉操作复杂、冲突不断,究其根源是对git的设计理念缺乏了解,没有搞清楚git...

zssureqh
2016/11/06
0
0
【转】Git详解之九 Git内部原理

Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式。我个人发现学习这些内容对于理解 Git 的用处和强大是非常...

季牧云
2012/06/15
217
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
13
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
10
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
12
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部