标记

本文档将讨论 Git 的标记概念和 git tag 命令。标记是指向 Git 历史记录中特定点的引用。标记通常用于捕获用于标记版本发布的历史点(即v1.0.1)。标记就像一个不变的分支。与分支不同,标记在创建后没有进一步的提交历史记录。有关分支的更多信息,请访问 git branch 页面。本文档将介绍不同类型的标记、如何创建标记、列出所有标记、删除标记、共享标记等。

创建标记

要创建新标记,请执行以下命令:

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

前面的示例使用了 -l 选项和 -rc 的通配符表达式,它返回标有 -rc 前缀的所有标记的列表,该前缀之前用于标识候选版本

标记旧提交

前面的标记示例演示了对隐式提交的操作。默认 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'

执行 git log 将输出提交列表。在这个例子中,我们将为新标记选择提交量最高的 Merge branch 'feature'。我们需要引用提交的 SHA 哈希才能传递给 Git:

git tag -a v1.2 15027957951b64cf874c3557a0f3547bd83b3ff6

执行上述 git tag 调用将为我们在上一个 git log 示例中选择的提交创建一个标识为 v1.2 的新的带注释的提交。

重新标记/替换旧标记

如果您尝试使用与现有标记相同的标识符创建标记,Git 会抛出一个错误,如下所示:

fatal: tag 'v0.4' already exists

此外,如果您尝试使用现有的标记标识符标记较旧的提交,Git 会抛出同样的错误。

如果您必须更新现有标记,则必须使用 -f FORCE 选项。

git tag -a -f v1.4 15027957951b64cf874c3557a0f3547bd83b3ff6

执行上述命令会将 15027957951b64cf874c357a0f357bd83ff6 提交映射到 v1.4 标记标识符。它将覆盖 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

要同时推送多个标记,请将 --tags 选项传递给 git push 命令。当其他用户克隆或提取代码存储库时,他们将收到新的标记。

查看标记

您可以使用 git checkout 命令在标记处查看代码存储库的状态。

git checkout v1.4

上面的命令将签出 v1.4 标记。这会使代码存储库处于游离的 HEAD 状态。这意味着所做的任何变更都不会更新标记。他们将创建一个新的游离的提交。这个新的游离的提交不会成为任何分支的一部分,只能通过提交 SHA 哈希直接访问。因此,在游离的 HEAD 状态下进行变更时,最好创建一个新分支。

删除标记

删除标记是一项简单的操作。将 -d 选项和标记标识符传递给 git tag 会删除已识别的标记。

$ 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 命令是标记的主要驱动力:创建、修改和删除。有两种类型的标记:带注释的标记和轻量级标记。带注释的标记通常更好,因为它们会存储有关标记的额外有价值的元数据。本文档中介绍的其他 Git 命令包括 git pushgit checkout访问他们的相应页面,讨论其扩展用途。

准备好了解 Git 了吗?

试用本交互式教程。

立即开始