在使用 Git 版本控管的过程中,会产生大量的版本,随著寒暑易节、物换星移,在这众多的版本之中,一定会有一些值得我们纪录的几个重要版本,这就是「标籤」 (Tag) 能帮我们做的事。
基本上,标籤的用途就是用来标记某一个「版本」或称为「commit 物件」,以一个「好记的名称」来帮助我们记忆【某个】版本。
Git 标籤 (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 物件都是不变的,只有索引才是变动的 )
我用一个简单的例子说明建立「轻量标籤」的过程,如下图示:(请自行看图说故事)
提示:所有在 .git\refs\
下的档案都是个「参考名称」。
大致的使用说明如下:
git tag
git tag [tagname]
git tag [tagname] -d
如果我们想看这个「轻量标籤」的内容,我们可以透过 git cat-file -p [tagname]
取得。如果我们想看这个「轻量标籤」的物件类型,可以透过 git cat-file -t [tagname]
取得。如下图示:
请注意: 轻量标籤不是个 Git 物件,所以我们从上图可以看出,该 Tag 名称取得的是 commit 物件的内容,而且该名称所查出的物件类型是 commit 物件。
我也用一个简单的例子说明建立「标示标籤」的过程,如下图示:(请自行看图说故事)
这裡跟「轻量标籤」有些不一样的地方:
git tag
列出所有标籤时,所有标籤都会混在一起,看不出标籤的类型。-a
参数。git commit
一样都有 -m
参数可用。git cat-file -p 1.0.0-beta
时,你应该可以看出这个物件内容跟 commit 物件稍稍有点不同。git cat-file -p 1.0.0-beta
时,你从内容看到的 type
讲的是上一行 object
的物件类型,这代表你也可以把任何 Git 物件建立成一个标籤物件。git cat-file -t 1.0.0-beta
时,得到的是 tag 物件类型。标示标籤的指令用法,跟轻量标籤一模一样,差别只有 -a
参数而已。(如果只有使用 -m
他会隐含著 -a
也帮你加上。)
※ 预设 git tag [tagname] -a
会将当前的 HEAD
版本建立成「标籤物件」,如果要将其他特定物件建立为标籤的用法为 git tag [tagname] [object_id]
。
最后,我把本篇文章建立的两个例子重新比较一遍,从下图你应该可以很清楚看出两者之间的差异:
我重新整理一下本日学到的 Git 指令与参数:
※ 若想查询 git tag
的完整用法,可在命令提示字元下执行 git help tag
即可显示完整的文件说明。