天天看点

g-git 相关命令 及其 基本原理探索 (一)

文章目录

  • ​​git 最小配置作用域​​
  • ​​git 创建本地仓库​​
  • ​​git log 查看版本演进​​
  • ​​.git 目录​​
  • ​​refs目录​​
  • ​​objects​​
  • ​​git 三种对象类型详解 (commit ,tree,blob)​​

因为工作需求,接下来将从git的使用到其内部工作原理,来避免代码提交或者review或者版本管理上的一些尴尬,同时也来学习一下这个优秀的分布式版本管理工具的实现,理解事务在分布式里面的原子性思想。

git 最小配置作用域

g-git 相关命令 及其 基本原理探索 (一)

git 创建本地仓库

g-git 相关命令 及其 基本原理探索 (一)

git log 查看版本演进

g-git 相关命令 及其 基本原理探索 (一)

.git 目录

g-git 相关命令 及其 基本原理探索 (一)

单独介绍一下如下两个重要的目录:

refs目录

refs目录下有两个目录:heads和tags

  • heads 保存的是独立的分支空间,且之间互不影响。
  • tags表示里程碑,项目开发到一定程度之后可以打上对应的tags作为一个阶段的标记

heads目录下的 分支内容保存的是一个个代表唯一分支的名称的四十位的hash值

g-git 相关命令 及其 基本原理探索 (一)

通过​

​git branch -av​

​看到的分支信息 看到的分支名称后面的hash值比较短,这里是只要这个hash值能够唯一代表当前的分支即可显示,所以短一点也是能够唯一性表示当前分支的。

g-git 相关命令 及其 基本原理探索 (一)

tags的目录下也保存着之前打过的tags,为每一个tags生成一个唯一的对象,且用40位的hash值进行标识

通过如下两个命令可以查看对应hash值代表的对象类型和操作内容

  • ​git cat-file -t hash_value​

    ​ 查看对象类型
  • ​git cat-file -p hash_value​

    ​ 查看对象内容

objects

目录内容如下:

g-git 相关命令 及其 基本原理探索 (一)

pack 是在多个松散目录较多的情况下对其进行压缩,将压缩后的数据保存到当前目录

其他松散目录来看一下

​cd 14 && ls -al​

g-git 相关命令 及其 基本原理探索 (一)

​git cat-file -t 142a4f1706858e07b1a29c591d48ebc3e562bc45​

​ -t来查看类型 以及-p 查看具体的内容

这里需要注意hash数值的前两位一定是目录名称,后面是实际的hash数值

g-git 相关命令 及其 基本原理探索 (一)

类型是tree,且发现内容是一个blob类型的对象,其保存的是我们当前git目录下的唯一一个文件test_file,继续查看其类型及内容

g-git 相关命令 及其 基本原理探索 (一)

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的版本控制和不同版本的合并功能是正常的。