Git & GitHub 杂记: 从Blob、Tree、Commit、Tag到数据存储

所有 Git 操作无非就是对 Git对象的操作,Git 对象包括 Blob对象、Tree对象、Commit对象和 Tag对象。

Blob 对象是一个二进制大对象,代表各个文件,存储所有文件除元数据之外的内容数据。 Gıt 仓库中以 SHA-1 值来标识 Blob,所以不按文件名寻址而是按内容寻址。

  • Bolb当然是在 git add filename之后创建的。

Tree 对象是一个二进制文件,代表各个目录,存储对 Blob对象和其它 Tree对象的引用(SHA-1 值),解决文件名的保存问题。Gıt 仓库同样以 SHA-1 值来标识 Tree。

  • 实际上,只需要 Tree 和 Blob 就能够保存 Git 仓库的当前状态,也就是 Git 快照。
  • 如果 Blob对象代表的文件没有变更,则所有 Tree对象始终通过同一个SHA-1 值保持对它的引用,否则变更导致 SHA-1变化时将更新 Tree对象所引用的SHA-1 值。效果就是,如果该文件没变更,后面所有版本的快照中都将引用该文件。
    在这里插入图片描述

Commit 对象是一个二进制文件,代表各个版本,存储对 Tree对象的引用(SHA-1 值)之外,还存储谁在什么时间以及为什么保存了某些快照等说明信息,解决快照的保存问题。Gıt 仓库同样以 SHA-1 值来标识 Commit。

  • 可以将 Commit对象视为链表的各个节点。 除第一个 Commit对象外,每个 Commit对象都有一个指向父 Commit对象的指针,一个 Commit可以有多个父 Commit,通过这些指针就能完成对提交的切换。
    在这里插入图片描述

Tag 对象是一个二进制文件,代表各个版本号,存储对 Commit对象的引用(SHA-1 值)以及指定给它的标签信息,解决 Commit对象的标注问题。 Gıt 仓库同样以 SHA-1 值来标识 Tag。

分支本质上是一个可变指针,是一个有名字的对 Commit对象的引用(SHA-1 值),分支始终指向最新提交,解决的是提交的分离与合并问题。

  • Git 默认分支名是 master。前段时间因为 BLM 改为“main”,但后来又提供了自由选择选项。
  • 分支看起来与标签 Tag 对象很像,只不过分支随着最新提交不断移动,而标签始终固定。
  • 合并的分支就是提交的提交,会产生合并点的提交拥有多个父提交的现象。

所以,Git 存储数据的过程大概是这样的:

  1. git add暂存文件后,创建 Blob对象和 Tree对象:
    在这里插入图片描述

  2. git commit提交暂存区后,创建Commit对象:
    在这里插入图片描述

3,多次提交后:
在这里插入图片描述
4,再打上标签v1.0:
在这里插入图片描述
5,分支的产生与切换:
在这里插入图片描述
6,在分支中工作:
在这里插入图片描述
在这里插入图片描述

7,合并分支:
在这里插入图片描述

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值