深入底层学git:目录中包含的秘密

Posted 小码哥说测试

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入底层学git:目录中包含的秘密相关的知识,希望对你有一定的参考价值。

深入底层学git:目录中包含的秘密_git

1.Git简介

​Git​​具有最优的存储能力,在没有远端git服务器的情况下,git本地就可以独立作为版本管控系统,这其中.git裸仓库中起了关键作用,那么我们一起来看看.git下都放了哪些文件。

打开Git Bash,切换到项目目录,具体命令,如下所示:

$ pwd  
$ ll
$ cd git-rainbow/
$ ll
$ cd mtxcrm/
$ ls -la

深入底层学git:目录中包含的秘密_测试工具_02

01、refs

除了上一篇文章提到的文件,还有哪些文件?

例如,refs引用,这个引用它指向的是什么呢?

深入底层学git:目录中包含的秘密_测试工具_03

我们先切换到这个目录下去看看。

这个目录下包含​​heads​​​和​​tags​​,说明什么?

说明我们的git仓库是可以有很多tags标签的,tags另一种翻译叫里程碑,也就是说,项目开发到一定程度,出了关键成果,比如说开发到v1.0版本,我们可以针对v1.0版本对应的​​commit​​​打上一个标签,标识这是v1.0里程碑,也叫做tag;另外一种情况就是​​heads​​和这个目录对应的,heads对应的就是我们大家平时说的分支。

大家总说分支,分支又是什么呢?分支说白了,就是一个独立的开发空间,比如有些时候需要做前端开发,有些时候需要做后端开发,这个时候我们就可以在仓库中,为前端创建一个分支,为后端创建一个分支,前后端彼此在不同的分支里面,他们的工作是互相不影响的,当她们需要集成的时候,又可以将这两个分支集成到一个公共的分支,这个就是分支的作用。

深入底层学git:目录中包含的秘密_测试工具_04

两者都是文件夹,我们切换到文件夹里面看看有哪些内容。

深入底层学git:目录中包含的秘密_github_05

先进入到​​heads​​文件夹。

heads目录下有 master、temp两个文件。我们分别看看master、temp这两个文件中存的是什么内容。

深入底层学git:目录中包含的秘密_软件测试_06

之前我们谈到的HEAD表示,我们整个仓库正在工作在哪个分支下,因此HEAD里存的是一个引用,它指向了master或者指向了temp。

深入底层学git:目录中包含的秘密_测试工具_07

指向refs下面的​​heads​​的下面的master或者temp。

深入底层学git:目录中包含的秘密_github_08

我们现在已经在refs下的​​heads​​目录下了。

深入底层学git:目录中包含的秘密_github_09

我们看看master文件中存的是什么?

master指向的是哪里呢?

深入底层学git:目录中包含的秘密_github_10

我们可以通过​​git cat-file -t​​查看这串字符串(git仓库存放的对象objects)代表的对象类型。

git cat-file -t 37af45d051cea
#37af45d051cea7efff9be02493366ba97fafa020

深入底层学git:目录中包含的秘密_测试工具_11

通过执行命令后的返回结果看,它是一个commit类型。

通过以下命令git命令,发现master指向哪里?指向37af开头的commit。

git branch -av

深入底层学git:目录中包含的秘密_git_12

其实就是master指针指向哪一个commit,也就是说master中存的是master指向的哪个commit。

那么temp中指向的是什么呢?如果不出意外的话,猜测temp文件中存的是,存的是0c193开头的字符串,这串字符串也是指针。

深入底层学git:目录中包含的秘密_自动化测试_13

为什么指针(或者叫指向)字符串有长有短呢?

git的设计思路是,如果哈希值足以标识唯一性的话,展示短一些也可以。

深入底层学git:目录中包含的秘密_自动化测试_14

如果短的识别号不能保证唯一识别的情况下,这个时候我们就需要输入更长的唯一标识位的个数。

深入底层学git:目录中包含的秘密_自动化测试_15

我们再跳转到​​tags​​目录下,看看该目录下都存什么了。

深入底层学git:目录中包含的秘密_git_16

看版本历史树的时候如果有t创建​​tags​​的话会列举出来的。

我们看看是否有tags,使用如下命令:

ls -al

通过以下截图可见有tag。

深入底层学git:目录中包含的秘密_自动化测试_17

然后我们使用cat命令查看下css01(这是一个文件)中存的是什么?

分支指向的是commit,这个tag如果也是打在这个commit上的话,css01中的内容是不是就是commit的id号呢?

深入底层学git:目录中包含的秘密_git_18

我们用cat-file命令验证这个哈希值是什么?

*注意:哈希值不用全部复制粘贴,只要能保证唯一性即可。

从如下截图可见,css01文件里面存的是tag的信息

深入底层学git:目录中包含的秘密_自动化测试_19

我们再通过​​cat-file​​命令加参数p来看文件中内容。

从如下截图中该命令的返回结果可见,返回的第一行表明指向该哈希值5237b82ab6b455d7c236的object对象。

object 5237b82ab6b455d7c2360c0829b78e46d3c381d2

深入底层学git:目录中包含的秘密_git_20

我们尝试看看这个哈希值存的是什么?我们通过​​cat-file​​命令加t参数看类型,如下截图所示是commit。

深入底层学git:目录中包含的秘密_github_21

tag本身有一个40位的哈希值。

深入底层学git:目录中包含的秘密_git_22

css01是askii码标识出来的tag的名称,叫css01。

深入底层学git:目录中包含的秘密_github_23

css01中存的是​​tag​​的哈希值。

深入底层学git:目录中包含的秘密_测试工具_24

然后看tag这个哈希值中存的是什么内容呢?从以下截图可见,里面包含一个object对象。

深入底层学git:目录中包含的秘密_git_25

这个对象的类型是​​commit​

深入底层学git:目录中包含的秘密_自动化测试_26

02、objects

​.git​​具仓库中还有一个至关重要的文件,也就是git文件系统核心内容,object。

从以下截图可见,objects目录下面很多文件夹,一般都是2个字符组成的。

​pack​​文件存的是什么内容呢?git会做一个自我梳理过程,当2个字符的松散文件比较多的时候,git会自行打包,打包到pack目录下。

深入底层学git:目录中包含的秘密_自动化测试_27

我们尝试切换到两个字符的目录下看看里面有什么内容,比如0c?

0c和这里面的字符串合起来拼成一个完成的哈希值,

也就是0c加上193c2ebc6cddc2b7693cefc35f14f95ecd87af

深入底层学git:目录中包含的秘密_github_28

这也是​​commit​​类型。

深入底层学git:目录中包含的秘密_软件测试_29

再找找其他目录看看有没有其他类型的。对象的类型包括blob, tree, commit, tag。

深入底层学git:目录中包含的秘密_github_30

tree树中的内容都包括什么呢?

100644 blob f432c2ba4f90913acf4a3774f73c5254e037dc07    rainbow.jpg

从以下截图可见,它说这个树里面有个文件,叫​​rainbow.jpg​​。

这个文件的哈希值是f432c2ba4f90913acf4a3774f73c5254e037dc07。

这里又有一个类型是blob,在git中blob表示文件的意思,也就是说​​rainbow.jpg​​是一个文件对象。

深入底层学git:目录中包含的秘密_自动化测试_31

我们来用​​cat-file​​加-t参数来验证下它是不是一个文件,从以下截图返回结果可见,这确实是一个文件对象。

深入底层学git:目录中包含的秘密_git_32

然后我们再通过​​cat-file​​加-p参数来看看这个文件中的内容,从以下截图乱码是图片内容。

深入底层学git:目录中包含的秘密_git_33

git的核心对象object存的类型是4类,分别是blob, tree, commit, tag。

学习资源分享

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走

深入底层学git:目录中包含的秘密_测试工具_34

这些资料,对于想进阶【自动化测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……



以上是关于深入底层学git:目录中包含的秘密的主要内容,如果未能解决你的问题,请参考以下文章

Localstack 抛出请求中包含的安全令牌无效

使用plumbing命令来深入理解git add和git commit的工作原理

22 张图让你洞察 Git 秘密

SQL 中有没有办法将目录中包含的所有 .csv 导入我的 postgres 表? (窗口操作系统)

深入理解JVM - 阶段总结与回顾

使用 .bat 文件在目录中包含的多个文件中查找和替换字符串