Git tag 标签的使用与详解
本章节将讨论Git 中的标签(tag)和 命令 git tag的用法。标签是指向 Git 历史记录中特定点的引用。标签通常用于标记版本发布(即 v1.0.1)的历史记录点。标签就像一个不会改变的分支。但是与分支不同,标签在创建后没有进一步的提交历史。
本文档将介绍不同类型的标签、如何创建标签、列出所有标签、删除标签、共享标签等。
如何创建标签
创建新标签,可以执行以下命令
$ git tag <tagname>
在创建标签时,使用语义标识符替换<tagname>来表示当前仓库的状态。一个常见的模式如下所示
$ git tag v1.4
Git 支持两种不同类型的标签,带注释的标签
和轻量级标签
。前面的示例创建了一个轻量级标签。轻量级标签和带注释的标签在它们存储的元数据量上有所不同。我们可以将带注释标签视为公共标签,将轻量级标签视为私有标签。带注释的标签会存储额外的元数据,例如:标记者名称、电子邮件和日期。轻量级标签本质上是提交的“书签”,它们只是一个名称和指向提交的指针,用于创建指向相关提交的快速链接。
带注释的标签
带注释的标签作为完整对象存储在 Git 数据库中。重申一下,它们存储额外的元数据,例如:标记者名称、电子邮件和日期。与提交和提交消息类似,带注释的标签有一个标记消息。此外,为了安全起见,可以使用 GNU Privacy Guard (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
或-m
选项。轻量级标签创建一个新的标签校验和并将其存储在项目存储库的.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
给之前的提交创建标签
前面的标签示例演示了对隐式提交的操作。默认情况下,git tag 将在HEAD
引用的提交上创建一个标签。git tag还可以对特定提交创建标签,而不是默认的HEAD。首先使用git log 查看提交列表
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'feature'
a6b4c97498bd301d84096da251c98a07c7723e65 add update method for thing
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
在这个例子中,我们将为最近的一次提交创建一个新标签。我们需要将提交ID 传递给 Git命令:
$ git tag -a v1.2 15027957951b64cf874c3557a0f3547bd83b3ff6
执行上述git tag命令将创建一个新的带注释的标签,标识为v1.2。
更新标签
如果你尝试使用与现有标签相同的标识符创建标签,Git 将抛出如下错误:
fatal: tag 'v0.4' already exists
此外,如果你尝试使用现有标签标识符来标记旧的提交,Git 将抛出相同的错误。
如果必须更新现有标签,则必须使用-f
选项。
$ git tag -a -f v1.4 15027957951b64cf874c3557a0f3547bd83b3ff6
执行上述命令会将15027957951b64cf874c3557a0f3547bd83b3ff6
提交映射到v1.4标签标识符。它将覆盖旧标签的任何现有内容。
共享:将标签推送到远程
共享标签类似于推送分支。默认情况下,git push不会推送标签。标签必须显式传递给git push。
$ 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 git@bitbucket.com:atlasbro/gittagdocs.git
* [new tag] v1.4 -> v1.4
要同时推送多个标签,需要在调用 git push 命令时使用--tags
选项。当另一个用户克隆或拉取一个仓库时,他们也将收到新标签。
签出标签
我们可以使用git checkout
命令查看标签处的仓库状态。
$ git checkout v1.4
上面的命令将检出v1.4标签。这使得仓库的HEAD处于分离状态。意味着所做的任何更改都不会更新标签的内容。它们将创建一个新的分离提交。这个新分离的提交将不是任何分支的一部分,并且只能由提交SHA哈希直接访问。因此,无论何时在分离的头部状态中进行更改,创建新分支都是最佳做法。
删除标签
删除标签是一个简单的操作。需要使用-d
选项,后面指定要删除的标签标识符。
$ git tag
v1
v2
v3
$ git tag -d v1
$ git tag
v2
v3
在此示例中执行 git tag 显示 v1、v2、v3 的标签列表,然后git tag -d v1
删除 v1 标签。