愿你坚持不懈,努力进步,进阶成自己理想的人

—— 2017.09, 写给3年后的自己

Git打标签功能详解

打标签功能对于标记发布节点尤其有用,这篇文章将总结git中打标签功能的详细用法

一、列出标签

列出标签功能可以查看已有的git标签,使用git tag命令即可:

$ git tag
v0.1
v1.3

如果只对特定的标签感兴趣,可以使用模式匹配查找,如:

$ git tag -l 'v1.8.5*'
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5


二、创建标签

git的标签中,有两种类型的标签:轻量标签(lightweight)附注标签(annotated),它们的区别如下:

  • 轻量标签: 像是一个不会改变的标签,它只是特定提交的引用
  • 附注标签: 是存储在git数据库中的一个完整对象,因此它可以包含打标签者的信息(名字电子邮件地址)、打标签时间以及标签信息。此外,它还可以被校验,且使用GNU Privacy Guard (GPG)签名与验证

至于使用哪一种,官方建议是使用附注标签,因为它可以拥有更多的信息。不过如果不想要保存那些信息,那么轻量标签也是OK的

1、打轻量标签

打轻量标签很简单,只需要一个标签名字,而不需要任何额外的信息,即:git tag <TagName>,如下:

$ git tag v1.4-lw

当在轻量标签上应用git show时,是不会显示任何额外信息的,如:

$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

2、打附注标签

创建附注标签,则需要增加-a参数表明它是一个附注标签,还需要增加-m参数指定信息。如下:

$ git tag -a v1.4 -m 'version 1.4'

当应用git show时,完整的信息就会被展示出来了:

$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number


三、后期打标签

如果不想对当前提交节点打标签,而是想对过去提交节点打标签,那么就可以使用后期打标签功能。假设我们现在的提交历史是这样子的:

$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme

我们想要对updated rakefile这次提交打标签,那么我们可以记录下它的commit-hash,即为:

9fceb02d0ae598e95dc970b74767f19372d61af8

然后,使用如下这种语法:

$ git tag -a v1.2 9fceb02d0ae598e95dc970b74767f19372d61af8

即可成功为那次提交创建标签了


四、共享标签

默认情况下,本地打的标签是包含推送到远程服务器上的,如果需要推送到远程服务器上,则需要使用:

$ git push origin <TagName>

如:git push origin v1.5,如果希望以此推送多个标签,则可以使用:

$ git push --tags

这样子它就会将远程服务器上不存在的本地标签都推送到远程服务器中


五、删除标签

如果要删除一个标签,则可以使用命令git tag -d <TagName>,如:

$ git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)

但是,这不会删除远程服务器中的标签,如果希望这种删除同步到远程服务器中,则需要使用git push <remote> :refs/tags/<TagName>这种语法,示例如下:

$ git push origin :ref/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
 - [deleted]         v1.4-lw


六、检出标签

我们可以使用git checkout来检出特定的标签。但是需要注意的是,这会导致头指针处于游离状态(detachthed HEAD),在这种状态下,如果做了某些更改并提交,那么标签不会发生任何变化。并且由于提交不属于任何分支,所以也无法访问这些提交。
因此,git checkout检出标签适用于对旧版本的只读状态,如果需要在旧版本上修复问题,则应该在检出之后,拉取新的分支,从而就不会有头指针游离状态带来的问题了


参考资料