(翻译)git 标签功能(tag)
标签功能
本文将讨论Git标签的概念和git tag命令。标签是指向Git历史记录中特定节点的索引。标签功能一般被用来记住某个,用来标记版本发布的历史节点。一个标记就像一个不会变化的分支。不同的与分支的地方是,标签,一旦被创建,将不再有后续的历史提交(commit)。本文将包好不同类型的标签、怎么创建标签、列举所有标签、删除标签、共享标签,等等。
创建标签
使用下面的命令来创建新的标签:
git tag
使用带语义的词组来代替tagName来记录仓库状态,在标签被创建的时候。常规写法是使用版本好如git tag v1.4。Git 支持两种不同类型的标签,批注(annotated)和简短标记。上述列子创建的是简短标签。简短标签和批注标签不同的地方在于他们存储的相关元数据的数量不同。最佳做法是将批注标签视为公共标签,简短标签视为私有标签。批注标签存储额外的元数据信息,例如:标签名称、邮箱和日期。对公开发布来说这是些重要的数据。简短标签是一个提交的重要的“书签”,只是一个名称和一个提交的节点,对于快速创建某个相关提交链接很有用。
批注标签
批注标签在git数据库中被类似于存储完整对象一样存储的。复述一下,批注标签存储了额外的元数据如,标签名称、邮箱和日期。类似于提交和提交信息,脾主标签也有一个标签信息。另外,出于安全考虑,批注标签可以使用GNU 私有守护(GPG)来签名和验证。比较推荐的git标签功能的用法是使用批注标签而不是简短标签,这样你可以得到所有相关的元数据。
git tag -a v1.4
执行这个命令将会创建一个新的名为v1.4的批注标签。命令行将开默认文本编辑器来记录额外的输入元数据。
git tag -a v1.4 -m "my version 1.4"
这条执行语句类似于上一次,然而,这次命令传入加了一个-m参数和信息。类似于git commit -m ,该方法将会创建一个新的标签,同时通过-m参数直接保存信息而不用打开本地文本编辑器来保存。
简短标签
git tag v1.4-lw
执行该命令创建一个标识为v1.4-lw的简短标签。若缺少 -a、-s或 -a参数,简短标签创建。简短标签创建给新的标签校验码并将它存储到项目中.git文件夹中。
列举标签
使用下面的命令来列举存储的标签:
git tag
输出标签列表:
v0.10.0
v0.10.0-rc1
v0.11.0
v0.11.0-rc1
v0.11.1
v0.11.2
v0.12.0
v0.12.0-rc1
v0.12.1
v0.12.2
v0.13.0
v0.13.0-rc1
v0.13.0-rc2
可以通过使用-l参数带入一个通配表达式的方式来改善标签列表:
$ git tag -l *-rc*
v0.10.0-rc1
v0.11.0-rc1
v0.12.0-rc1
v0.13.0-rc1
v0.13.0-rc2
v0.14.0-rc1
v0.9.0-rc1
v15.0.0-rc.1
v15.0.0-rc.2
v15.4.0-rc.3
上述例子使用-l××参数和-rc**通配表达式,返回的所有标签都带有-rc前缀,该前缀通常用来说明适合发布。
给原有的提交打标签
前面的例子展示了在隐式的提交上的打标签操作。默认情况下,git tag将会在HEAD(当前工作区)指向的提交上创建一个标签。相应的git tag可以当做一个索引传入一个特定的提交中。这将在过去提交上打标签而不是默认的工作区当前的提交。通过git log命令展示提交列表:
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'feature'
a6b4c97498bd301d84096da251c98a07c7723e65 add update method for thing
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
执行git log将会输出一个提交列表。在本例中我们将选取上述列表中最上方的提交“Merge branch 'feature'"来创建新标签。需要将提交的SHA哈希码传入:
git tag -a v1.2 15027957951b64cf874c3557a0f3547bd83b3ff6
执行上述命令将会在我们从前面git log例子中选择的提交上,创建一个批注标签,名称为v1.2。
重新打标签/取代旧标签
如果你想创建和已经存在的标签名称相同的标签的话,Git将会抛出类似于这样的错误:
fatal: tag 'v0.4' already exists
另外,如果你想给一个已经打过标签的提交打标签的话,git会抛出相同的错误。
在那些必须更新已经存在的标签的情况下,必须使用强制参数,-f。
git tag -a -f v1.4 15027957951b64cf874c3557a0f3547bd83b3ff6
共享标签
共享标签和推送分支类似。默认情况下,Git推送不会推送标签。标签必须明确的推送到git。
$ git push origin v1.4
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To [email protected]:atlasbro/gittagdocs.git
* [new tag] v1.4 -> v1.4
若要同时推送多个标签需要在git push命令中添加--tags参数。当其他用户克隆或拉取仓库代码时,他们将接收到新的标签。
读取标签
你可以使用git checkout命令查看仓库在某个标签下的状态(代码)。
git checkout v1.4
上述命令将会读取v1.4标签。让git仓库进入游离状态(detached HEAD).这意味着任何变化也不会更新当前标签。将会创建一个新的游离提交。这个新的游离提交不属于任何分支的一部分,只能通过该提交的SHA哈希码直接达到该状态。因此当你要在游离分支状态做任何改变时最好的做法是创建一个新的分支。
删除标签
删除标签是一步简单的操作。给git tag命令传入-d参数和一个标签名将会删除该标签。
$ git tag
v1
v2
v3
$ git tag -d v1
$ git tag
v2
v3
本例中,git tag命令展示所有的的标签:v1,v2,v3,在执行** git tag -d v1**来删除v1标签。
总结
总得来说,标签功能是一套用来创建git仓库快照的附加机制。标签功能一般用来创建对应于软件发布过程中的版本号的版本记录。git tag是最基本的命令:创建、修改和删除功能都是通过它完成。有两个类型的标签:批注标签和简短标签。批注标签一本来说是更好的使用方式,因为它存储了额外的有效元信息。
参考文章