tag 多用于对代码某一时间点坐标记,或者标记某个 milestone,一般用在上线时,线上重要版本都要打上标签,一来方便查看追踪,二来如果出问题了也方便回滚。

先看用法:

用法:git tag [-a|-s|-u <key-id>] [-f] [-m <说明>|-F <文件>] <标签名> [<头>]
  或:git tag -d <标签名>...
  或:git tag -l [-n[<num>]] [--contains <提交>] [--points-at <对象>]
                [<模式>...]
  或:git tag -v <标签名>...

    -l, --list            列出tag名称
    -n[<n>]               每个 tag 信息打印 <n> 行
    -d, --delete          删除 tags
    -v, --verify          验证 tags

Tag 创建选项
    -a, --annotate        注解 tag,需要一个说明
    -m, --message <说明>  tag 说明
    -F, --file <文件>     从文件中读取提交说明
    -s, --sign            注解并 GPG 签名的 tag
    --cleanup <模式>      设置如何删除提交说明里的空格和#注释
    -u, --local-user <key-id>
                          使用另外的私钥签名 tag
    -f, --force           如果存在,替换现有的 tag
    --column[=<风格>]     以列的方式显示 tag
    --sort <类型>         排序 tags

Tag 列表选项
    --contains <提交>     只打印包含提交的tags
    --points-at <对象>    只打印tags对象
    

查看所有 tag

git tag
或者
git tag -l

v4.5.2
v4.5.3
v4.5.5
v5.0.0
v5.0.1
v5.0.2
v5.0.4

注意此时显示的 tag 是按字母排序的,而不是按打 tag 的时间。

搜索 tag

可以用特定的搜索模式列出符合条件的 tag。例如:列出所有 5.0 的版本。

git tag -l 'v5.0*'

v5.0.0
v5.0.1
v5.0.2
v5.0.4

创建 tag

创建 tag 有两种方式,一种是创建 lightweight (轻量级的),另一种是 annotated (含标记的)。这两种的区别 git book 中给出的解释是:

轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。

所以,一般来说是推荐使用 annotated。

创建轻量级 tag

git tag v0.1

此时 -a -m 选项都不需要,只需要制定 tag 名称即可。

创建含标注的 tag

git tag -a v1.0 -m 'this is a test tag.'

需要注意的是,如果 -m option 没有给出, git 会启动文本编辑软件供用户输入说明。个人推荐这种方式,因为在文本编辑器中可以输入大段的文本、列表、回车等等,这时就可以输入这个 tag 的详细描述了(新功能、bug 列表等变更记录),而在 -m 选项中一般只能输入一行文字。

查看创建的 tag

git show v1.0

tag v1.0
Tagger: tonghs <tonghuashuai@gmail.com>
Date:   Tue May 17 09:38:59 2016 +0800

* this is a test tag
* this tag will be removed

commit 6b5c580f5b6b1a3b2a06bf0bf7682a7fe4942fb4
Merge: adfe681 c62cb18
Author: 仝华帅 <tonghuashuai@pe.vc>
Date:   Tue May 17 08:11:35 2016 +0800

    Merge branch 'master' into 'master'

轻量级的 tag 显示的信息除了没有说明以外,其他的都一样。

后期补 tag

想想一个这样的场景:本应该在某次提交(9fceb02d0ae598e95dc970b74767f19372d61af8)后加上 tag,结果忘了,此时该次提交后已经有了其他的 commit,此时如果需要补 tag 的话,不需要将代码 rollback 到 9fceb02d0ae598e95dc970b74767f19372d61af8 也可以打 tag。

git tag -a v1.2 9fceb02

push tag

tag 打好后需要 push 到远端服务器上,默认情况下,git push 并不会 push tag。push tag 的命令类似于 push 分支:

git push origin v1.0

如果想 push 所有本地 tag,可以使用 --tags option。

git push origin --tags

删除标签

未 push 的 tag:

git tag -d v1.0

已删除 tag 'v1.0'(曾为 623b6a1)

已经 push 的 tag:

git push origin --delete tag v1.0