文章目录
- git 最小配置作用域
- git 创建本地仓库
- git log 查看版本演进
- .git 目录
- refs目录
- objects
- git 三种对象类型详解 (commit ,tree,blob)
因为工作需求,接下来将从git的使用到其内部工作原理,来避免代码提交或者review或者版本管理上的一些尴尬,同时也来学习一下这个优秀的分布式版本管理工具的实现,理解事务在分布式里面的原子性思想。
git 最小配置作用域
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SNyATOzIDOjFGNlZzM4QjNzYzXwUzMxETM0AzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
git 创建本地仓库
git log 查看版本演进
.git 目录
单独介绍一下如下两个重要的目录:
refs目录
refs目录下有两个目录:heads和tags
- heads 保存的是独立的分支空间,且之间互不影响。
- tags表示里程碑,项目开发到一定程度之后可以打上对应的tags作为一个阶段的标记
heads目录下的 分支内容保存的是一个个代表唯一分支的名称的四十位的hash值
通过
git branch -av
看到的分支信息 看到的分支名称后面的hash值比较短,这里是只要这个hash值能够唯一代表当前的分支即可显示,所以短一点也是能够唯一性表示当前分支的。
tags的目录下也保存着之前打过的tags,为每一个tags生成一个唯一的对象,且用40位的hash值进行标识
通过如下两个命令可以查看对应hash值代表的对象类型和操作内容
-
查看对象类型git cat-file -t hash_value
-
查看对象内容git cat-file -p hash_value
objects
目录内容如下:
pack 是在多个松散目录较多的情况下对其进行压缩,将压缩后的数据保存到当前目录
其他松散目录来看一下
cd 14 && ls -al
git cat-file -t 142a4f1706858e07b1a29c591d48ebc3e562bc45
-t来查看类型 以及-p 查看具体的内容
这里需要注意hash数值的前两位一定是目录名称,后面是实际的hash数值
类型是tree,且发现内容是一个blob类型的对象,其保存的是我们当前git目录下的唯一一个文件test_file,继续查看其类型及内容
git 三种对象类型详解 (commit ,tree,blob)
目前通过对git目录的访问,可以看到git拥有三种主要的核心对象:commit(heads目录),tree(objects目录),blob(实际的数据,保存在tree对象的指向中)
- commit类型就是我们使用
提交之后创建的数据对象,使用git commit
git cat-file -p b360e56
后面的字符串是本次commit下的内容信息,它是按照树形存储的。主要是里面的tree类型的文件夹。
内容如下:
root@root heads % git cat-file -p b360e56b39a5d605918816ea4dc07d61e93b12f8
tree 142a4f1706858e07b1a29c591d48ebc3e562bc45
parent 30a71408576f421909d05cdd424703b8866dd943
author BaronStack <[email protected]> 1593260841 +0800
committer BaronStack <[email protected]> 1593260841 +0800
- tree 类型就是git目录的管理结构,也可以当作文件夹来看。通过tree的hash值我们能够访问到存储与其文件夹内部的子目录以及对应的子文件。
- blob类型 是真正存放数据的内容,只要数据的内容一样,git这里只会创建一个blob对象。所以,这里也保证了blob的版本控制和不同版本的合并功能是正常的。