30 天精通 Git 版本控管

 主页   资讯   文章   代码   电子书 

第 15 天:标籤 - 标记版本控制过程中的重要事件

在使用 Git 版本控管的过程中,会产生大量的版本,随著寒暑易节、物换星移,在这众多的版本之中,一定会有一些值得我们纪录的几个重要版本,这就是「标籤」 (Tag) 能帮我们做的事。

关于标籤 (Tag) 的基本概念

基本上,标籤的用途就是用来标记某一个「版本」或称为「commit 物件」,以一个「好记的名称」来帮助我们记忆【某个】版本。

Git 标籤 (Tag) 拥有两种型态,这两种类型分别是:

  • 轻量标籤 (lightweight tag)
  • 标示标籤 (annotated tag)

我们在【第 11 天:认识 Git 物件的一般参照与符号参照】文章中有提到「一般参照」包含了「标籤名称」这项,这裡的「标籤名称」就是所谓的「轻量标籤」(lightweight tag) 。所以「轻量标籤」可以说是某个 commit 版本的「别名」而已,是一种「相对名称」。

「标示标籤」(annotated tag)则是一种 Git 物件,就像我们在【第 06 天:解析 Git 资料结构 - 物件结构】提到的,Git 物件包含 4 种物件类型,分别是 Blob, Tree, Commit 与 Tag 物件,这裡讲的「标示标籤」就是 Tag 物件。Tag 物件会储存在 Git 的物件储存区当中 ( 会存到 .git\objects\ 目录下 ),并且会关联到另一个 commit 物件,建立「标示标籤」时还能像建立 commit 物件时一样包含「版本讯息」。在内建的 Git 标籤机制中,甚至你还可以利用 GnuPG 金钥对 Tag 物件加以签章,以确保讯息的「不可否认性」。

虽然我们有这两种标籤类型,看起来也都像某个 commit 物件的「别名」,但这两种标籤在使用上只有些微的差异而已。在大部分的使用情境下,我们都会用「标示标籤」来建立「标籤物件」并且给予「版本讯息」,因为这种「标籤」才是 Git 储存库中「永久的物件」。( 储存到物件储存库中的 Git 物件都是不变的,只有索引才是变动的 )

了解轻量标籤(lightweight tag)的使用方式

我用一个简单的例子说明建立「轻量标籤」的过程,如下图示:(请自行看图说故事)

image

提示:所有在 .git\refs\ 下的档案都是个「参考名称」。

大致的使用说明如下:

  • 列出所有标籤:git tag
  • 建立轻量标籤:git tag [tagname]
  • 删除轻量标籤:git tag [tagname] -d

如果我们想看这个「轻量标籤」的内容,我们可以透过 git cat-file -p [tagname] 取得。如果我们想看这个「轻量标籤」的物件类型,可以透过 git cat-file -t [tagname] 取得。如下图示:

image

请注意: 轻量标籤不是个 Git 物件,所以我们从上图可以看出,该 Tag 名称取得的是 commit 物件的内容,而且该名称所查出的物件类型是 commit 物件。

了解标示标籤(annotated tag)的使用方式

我也用一个简单的例子说明建立「标示标籤」的过程,如下图示:(请自行看图说故事)

image

这裡跟「轻量标籤」有些不一样的地方:

  1. 当我们执行 git tag 列出所有标籤时,所有标籤都会混在一起,看不出标籤的类型。
  2. 建立「标示标籤」要加上 -a 参数。
  3. 建立「标示标籤」一定要加上「版本讯息」,跟执行 git commit 一样都有 -m 参数可用。
  4. 当我们执行 git cat-file -p 1.0.0-beta 时,你应该可以看出这个物件内容跟 commit 物件稍稍有点不同。
  5. 当我们执行 git cat-file -p 1.0.0-beta 时,你从内容看到的 type 讲的是上一行 object 的物件类型,这代表你也可以把任何 Git 物件建立成一个标籤物件。
  6. 当我们执行 git cat-file -t 1.0.0-beta 时,得到的是 tag 物件类型。

标示标籤的指令用法,跟轻量标籤一模一样,差别只有 -a 参数而已。(如果只有使用 -m 他会隐含著 -a 也帮你加上。)

※ 预设 git tag [tagname] -a 会将当前的 HEAD 版本建立成「标籤物件」,如果要将其他特定物件建立为标籤的用法为 git tag [tagname] [object_id]

今日小结

最后,我把本篇文章建立的两个例子重新比较一遍,从下图你应该可以很清楚看出两者之间的差异:

image

我重新整理一下本日学到的 Git 指令与参数:

  • git tag
  • git tag [tagname]
  • git tag [tagname] -a
  • git tag [tagname] -d

※ 若想查询 git tag 的完整用法,可在命令提示字元下执行 git help tag 即可显示完整的文件说明。

参考链接