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

文章目录

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

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

git 最小配置作用域

g-git 相关命令 及其 基本原理探索 (一)_第1张图片

git 创建本地仓库

g-git 相关命令 及其 基本原理探索 (一)_第2张图片

git log 查看版本演进

g-git 相关命令 及其 基本原理探索 (一)_第3张图片

.git 目录

g-git 相关命令 及其 基本原理探索 (一)_第4张图片
单独介绍一下如下两个重要的目录:

refs目录

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

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

heads目录下的 分支内容保存的是一个个代表唯一分支的名称的四十位的hash值
g-git 相关命令 及其 基本原理探索 (一)_第5张图片
通过git branch -av看到的分支信息 看到的分支名称后面的hash值比较短,这里是只要这个hash值能够唯一代表当前的分支即可显示,所以短一点也是能够唯一性表示当前分支的。
在这里插入图片描述

tags的目录下也保存着之前打过的tags,为每一个tags生成一个唯一的对象,且用40位的hash值进行标识
通过如下两个命令可以查看对应hash值代表的对象类型和操作内容

  • git cat-file -t hash_value 查看对象类型
  • git cat-file -p hash_value 查看对象内容

objects

目录内容如下:
g-git 相关命令 及其 基本原理探索 (一)_第6张图片
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对象的指向中)

接下来看看三种对象类型之间的关系
g-git 相关命令 及其 基本原理探索 (一)_第7张图片

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

你可能感兴趣的:(#,linux操作系统:常用命令)