Day18|【Git】存在 .git 目录里的东西 - Commit 与 Tag(下)

在上一篇章节介绍过 Blob 物件与 Tree 物件後,接下来让我们认识 Commit 与 Tag 分别是什麽吧!


Commit

  • 拥有 SHA1 档名,储存在 .git/objects 目录下
  • Commit 只能纪录 Tree,不能纪录 Blob

在我们使用 git add 指令加至暂存区时,会产生一个 Blob 物件,纪录档案的内容;而在执行 git commit 指令时,会发现除了新增 Tree 型态的物件来储存档名之类的东西,同时又有其他 SHA-1 杂凑值出现,让我们来看看这型态是什麽吧!

首先,我 git commit 了一个新的版本,可以看到 objects 目录内新增了两笔档案。

$ git commit -m"纪录讯息“

https://ithelp.ithome.com.tw/upload/images/20211001/20141010leh9mnHbbf.png

objects 目录内新增了两笔档案

让我们分别用指令查查看这两个档案的「型态」分别是什麽。

$ git cat-file -t [SHA-1 杂凑值(40字元)] #查看档案型态

-t 参数为用来查看档案的型态-p 参数则是查看档案的内容

https://ithelp.ithome.com.tw/upload/images/20211001/20141010D2l8vuVBFZ.png

讯息提示发现有 Tree 物件与 Commit ,由於在前面章节有介绍过 Tree 物件,那麽这里的 Commit 纪录什麽内容呢?这就是我们接下来要了解的 Commit 物件。

首先我们先看一下 Commit 物件的内容:

$ git cat-file -p [Commit 物件的 40 字元] # 查看物件内容

-t 参数为用来查看档案的型态-p 参数则是查看档案的内容

https://ithelp.ithome.com.tw/upload/images/20211001/20141010slnS2bjFRQ.png

得到的提示会有:

tree e07ec1da62dfc5eaf8dee3964c2008eedaac7e35
parent dba939f16134c489b3d5ab198fd32cdc7db45e16
author cycChuyin <[email protected]> 1633096798 +0800
committer cycChuyin <[email protected]> 1633096798 +0800

update

分别纪录着:

  1. 某个 Tree 物件。
  2. parent 表示指向上一次的 Commit
  3. 本次进行 Commit 的时间。
  4. 作者跟进行这次 Commit 的人
  5. 本次 Commit 的讯息

Parent 关系决成了 Git 线图的线如何连接,除了作为起点的 Commit 之外,每个 Commit 都有 Parent,有时还会有两个以上的 Parent。
因为有 Parent 纪录前一个 Commit ,所有的 Commit 都可以串连起来,因此可以继续透过 git cat-file 指令找到我们要的档案或是档名等等。

从上面结果来看,我们可以整理 Commit 、 Tree 、 Blob 之间的关系。

https://ithelp.ithome.com.tw/upload/images/20211001/20141010ItUnDWpDWy.png

如果又提交一次 Commit ,则关系变化会是:

https://ithelp.ithome.com.tw/upload/images/20211001/201410107UhogoDZPE.png

👉 整理目前为止的规则:

  • Commit 只会指向 Tree 物件。
  • Tree 物件会指向某个或多个 Blob 物件,同时也可 Tree 物件指向其他的 Tree 物件。
  • 除了第一次的 Commit 以外,其他的 Commit 都会指向他的前一次 Commit 物件。

⚠️ 特别注意:Commit、Tree、Blob 都是除存在 .git/objects 里面,以 SHA1 当档名的二进制档案!


Tag

Tag 物件不会在我们执行 Commit 的过程中产出,而是需要透过我们手动把 Tag 贴在某个 Commit 上。

Tag 有分「轻量标签」与「附注标签」,这在後续的篇幅会介绍到。

首先让我们在某个 Commit 上新增附注标签:

$ git tag -a [Tag名称] -m"纪录讯息"

-a 参数为新增附注标签之意

https://ithelp.ithome.com.tw/upload/images/20211001/20141010vSNF6ITOsa.png

此时在 Object 目录里会看到新增的档案:

https://ithelp.ithome.com.tw/upload/images/20211001/20141010U8nb3aGRVa.png

让我们看看这个档案的型态跟内容分别是什麽呢?使用 git cat-file 指令搭配参数查看

$ git cat-file -t [SHA-1值] # 型态
$ git cat-file -p [SHA-1值] # 内容

https://ithelp.ithome.com.tw/upload/images/20211001/20141010fQrz0rqLPc.png

Tag 回馈讯息一样包含了作者名称、新增的日期、Tag 标签名称,以及当时纪录的讯息。

但这里需要注意的是:

⚠️ Tag 物件并不是以 SHA-1 当档名的二进制档案,而是纪录着「Commit」的 SHA-1,并储存在 .git/refs 里面。

https://ithelp.ithome.com.tw/upload/images/20211001/20141010DCIADgvT7D.png

Tag 标签不会随着 Commit 新增而移动,他会固定指向那个 Commit


小结:

Git 四种物件的关系与执行指令时的关系:

  • git add:建立 Tree、Blob 物件。为提交时做准备。
    • 将档案内容转成 Blob 物件。目录、档名以 Tree 物件储存。
    • Tree 物件指向 Blob 物件或是其他的 Tree 物件。
  • git commit:建立一个 Commit 的档案储存在 .git/objects。
    • Commit 会指向一个 Tree 物件
    • 除了第一个新增的 Commit 外,其余 Commit 都会指向前一个 Commit 。
  • git tag:建立 Tag 档案(Snnotated Tag),纪录某个 Commit 的 SHA-1 值,并储存在 .git/refs。
    • Tag 物件指向某个 Commit 物件

参考文章:Git 原理入门


<<:  D24 - Transaction

>>:  ASP.NET MVC 从入门到放弃(Day27)-IIS 发布介绍

[Day18] TS:理解 Omit 的实作

是我们今天要聊的内容,老样的,如果你已经可以轻松看懂,欢迎直接左转去看同事 Ken 精彩的文章 —...

Bloom效果,又或是高光效果

文章内使用Unity 2019 LTS 目标 Bloom效果 Bloom 以下这张图片也是一个常见...

D3JsDay01 资料视觉化 图表说说话—介绍篇

简介 本系列内容将会提及D3Js和资料相关内容的知识,主题订定为资料驾驭网页,其实一部分原因来自D3...

JS 16 - jQuery 太重了,何不选择需要的功能就好?

大家好! 相信各位都有看到标题了,今天开始就要实作函式库了。 我们进入今天的主题吧! jQuery ...

不只懂 Vue 语法:为何元件里的 data 必须是函式?建立 data 时能否使用箭头函式?

问题回答 元件里的 data 必须是函式是为了确保元件里的资料不会被别的元件资料所污染。如果 dat...