Skip to content

Git - 标签操作

Git 中的标签用于标记项目历史中的重要节点,通常用于发布版本(例如,v1.0.0,v2.0-beta)。标签一旦创建,就如同一个指向特定提交(commit)的不可移动的引用。

Git 中主要有两种类型的标签:

  • 轻量标签(Lightweight tags): 这就像一个不会改变的分支——仅仅是指向特定提交的指针。它们不存储任何额外信息。
  • 附注标签(Annotated tags): 这些标签以完整的对象存储在 Git 数据库中。它们带有校验和(checksum);包含打标签者的姓名、电子邮件和日期;有一个标签消息(tagging message);并且可以进行 GPG 签名。通常建议对发布版本或重要的公共标记使用附注标签。

要创建附注标签,请使用 git tag -a <tagname> -m <message> 命令。-a 标志表示这是一个附注标签,而 -m 则用于提供标签消息。

$ git log --oneline -1 # 获取最新的提交哈希(可选,默认为 HEAD)
# a1b2c3d (HEAD -> main) 添加超级功能
# 为当前提交(HEAD)打一个附注标签
$ git tag -a v1.0 -m "版本 1.0 发布"
# 也可以通过提供提交哈希来为特定提交打标签:
$ git tag -a v0.9 -m "0.9 预发布版本" a1b2c3d

要创建轻量标签,只需提供标签名称,无需添加 -a、-s 或 -m 等选项:

$ git tag v1.0-lw # 创建一个指向 HEAD 的轻量标签 v1.0-lw

要列出仓库中所有可用的标签,请使用 git tag 命令(或 git tag -l):

v0.9
$ git tag
# v1.0
# v1.0-lw

也可以搜索符合特定模式的标签:

v1.0
$ git tag -l "v1.*" # 列出以 v1. 开头的标签
# v1.0-lw

要查看与标签关联的数据(特别是附注标签),请使用 git show <tagname>:

$ git show v1.0

附注标签的输出内容大致如下:

tag v1.0
Tagger: Your Name <your.email@example.com>
Date: Mon Jan 1 10:00:00 2024 +0000
版本 1.0 发布
commit a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0 (HEAD -> main, tag: v1.0-lw, tag: v1.0, tag: v0.9)
Author: Committer Name <committer.email@example.com>
Date: Mon Jan 1 09:50:00 2024 +0000
添加超级功能
diff --git a/feature.txt b/feature.txt
new file mode 100644
index 0000000..e69de29

对于轻量标签,git show 将显示标签所指向的提交的信息,而不包含标签特定的元数据。

默认情况下,git push 命令不会把标签传输到远程服务器。你需要显式地推送标签。

推送单个特定的标签:

$ git push origin v1.0

推送所有尚未在远程仓库上的本地标签:

$ git push origin --tags

推送后,其他协作人员可以将这些标签获取(fetch)到他们的本地仓库中。

要从本地仓库中删除标签,请使用 git tag -d <tagname> 命令:

$ git tag -d v1.0-lw
# 已删除标签 'v1.0-lw' (was fedcba9)

如果已经将标签推送到远程仓库并需要从那里删除它,则需要推送一个特殊的“删除”引用。现代语法是 git push origin --delete <tagname>:

$ git push origin --delete v0.9
# To https://github.com/user/project.git
# - [deleted] v0.9

一个较旧但仍然可用的语法是 git push origin :refs/tags/<tagname>:

$ git push origin :refs/tags/old-tag-to-delete

注意:从远程仓库删除标签应谨慎进行,特别是如果其他人可能已经在使用了该标签。

如果想查看项目在特定标签时的状态,可以检出(check out)该标签。这会让你进入“分离头指针”(detached HEAD)状态,意味着你当前不在任何分支上。这对于检查代码或从该点创建新分支很有用。

$ git checkout v1.0
# 注意:正在切换到 'v1.0'。
# 你正处于“分离头指针” (detached HEAD) 状态...

如果想在该标签版本的基础上进行工作,通常最好从该标签创建一个新分支:

$ git checkout -b branch_from_v1.0 v1.0
# 已切换到一个新分支 'branch_from_v1.0'

标签对于以下用途至关重要:

  • 软件发布(Software Releases): 标记稳定版本,例如 v1.0.0、v1.0.1、v2.0.0-rc1。
  • 部署触发器(Deployment Triggers): CI/CD 系统经常使用标签来触发特定版本的构建和部署流程。
  • 历史标记(Historical Markers): 识别项目历史中的重要里程碑或稳定点,以便轻松参考。

有关标签管理的更多详细信息,请查阅 Git 官方文档中的标签管理章节。