Skip to content

标签管理

概述

标签(Tag)是 Git 中用于标记特定提交的引用,通常用于标记发布版本。与分支不同,标签是不可变的,一旦创建就指向固定的提交,非常适合标记重要的里程碑。

什么是标签

标签的定义

标签是对某个特定提交的命名引用,它:

  • 不可变:始终指向同一个提交
  • 语义化:使用有意义的名称标记版本
  • 持久化:可以推送到远程仓库共享

标签的用途

  • 版本发布:标记软件发布版本
  • 里程碑:标记重要的开发节点
  • 回滚参考:作为回滚的目标点
  • 文档参考:在文档中引用特定版本

标签与分支的区别

特性标签分支
可变性不可变可变
指向固定提交移动指针
用途标记版本开发功能
更新不更新随提交移动

git tag 创建标签

查看标签

列出所有标签:

bash
git tag

模糊搜索标签:

bash
git tag -l "v1.*"

输出:

v1.0.0
v1.0.1
v1.1.0

创建轻量标签

bash
git tag <tag-name>

示例:

bash
git tag v1.0.0

创建附注标签

bash
git tag -a <tag-name> -m "message"

示例:

bash
git tag -a v1.0.0 -m "Release version 1.0.0"

为历史提交创建标签

bash
git tag -a <tag-name> <commit-hash> -m "message"

示例:

bash
git tag -a v0.9.0 abc1234 -m "Release version 0.9.0"

查看标签信息

bash
git show <tag-name>

示例:

bash
git show v1.0.0

输出:

tag v1.0.0
Tagger: John Doe <john@example.com>
Date:   Mon Jan 1 10:00:00 2024 +0800

Release version 1.0.0

commit abc123def456...
Author: John Doe <john@example.com>
Date:   Mon Jan 1 09:00:00 2024 +0800

    feat: add user authentication

删除本地标签

bash
git tag -d <tag-name>

示例:

bash
git tag -d v1.0.0

检出标签

bash
git checkout <tag-name>

示例:

bash
git checkout v1.0.0

这会使仓库处于"游离 HEAD"状态。

创建分支基于标签:

bash
git checkout -b version1 v1.0.0

轻量标签 vs 附注标签

轻量标签

创建方式

bash
git tag v1.0.0

特点

  • 只是一个指向提交的引用
  • 不包含额外信息
  • 创建速度快
  • 适合临时标记

查看信息

bash
git show v1.0.0

只显示提交信息,无标签信息。

附注标签

创建方式

bash
git tag -a v1.0.0 -m "Release version 1.0.0"

特点

  • 包含标签作者信息
  • 包含创建日期
  • 包含标签消息
  • 可以 GPG 签名
  • 推荐用于正式发布

查看信息

bash
git show v1.0.0

显示完整的标签信息和提交信息。

对比总结

特性轻量标签附注标签
存储内容提交引用完整对象
作者信息
创建日期
标签消息
GPG 签名不支持支持
推荐场景临时标记正式发布

GPG 签名标签

创建 GPG 签名标签:

bash
git tag -s v1.0.0 -m "Release version 1.0.0"

验证标签签名:

bash
git tag -v v1.0.0

推送标签到远程

推送单个标签

bash
git push origin <tag-name>

示例:

bash
git push origin v1.0.0

推送所有标签

bash
git push origin --tags

推送时自动推送标签

配置自动推送:

bash
git config --global push.followTags true

只推送附注标签:

bash
git push --follow-tags

删除远程标签

bash
git push origin --delete <tag-name>

或使用简写:

bash
git push origin :refs/tags/<tag-name>

示例:

bash
git push origin --delete v1.0.0

查看远程标签

bash
git ls-remote --tags origin

同步远程标签

获取远程标签:

bash
git fetch --tags

获取并清理本地不存在的远程标签:

bash
git fetch --tags --prune-tags

标签管理最佳实践

命名规范

语义化版本

v1.0.0
v1.0.1
v1.1.0
v2.0.0

预发布版本

v1.0.0-alpha
v1.0.0-beta
v1.0.0-rc.1

日期版本

v2024.01.01
v2024.01.15

创建标签流程

bash
git checkout main
git pull origin main

git tag -a v1.0.0 -m "Release version 1.0.0"

git push origin v1.0.0

标签消息模板

markdown
## 版本 1.0.0

### 新功能
- 添加用户认证功能
- 实现数据导出功能

### Bug 修复
- 修复登录超时问题
- 解决数据同步错误

### 变更
- 更新 API 接口
- 优化数据库查询

### 升级说明
- 需要更新配置文件
- 需要运行数据库迁移

标签保护

在 GitHub/GitLab 中设置标签保护规则:

  • 禁止删除标签
  • 禁止强制推送标签
  • 限制创建标签的用户

标签操作示例

查看两个标签之间的变更

bash
git log v1.0.0..v1.1.0 --oneline

查看标签之间的文件差异

bash
git diff v1.0.0 v1.1.0

比较标签和当前代码

bash
git diff v1.0.0 HEAD

创建标签分支

bash
git checkout -b hotfix/v1.0.1 v1.0.0

重命名标签

Git 不支持直接重命名标签,需要:

bash
git tag -a v1.0.1 v1.0.0
git tag -d v1.0.0
git push origin :refs/tags/v1.0.0
git push origin v1.0.1

常见问题

标签已存在错误

fatal: tag 'v1.0.0' already exists

解决方法:

bash
git tag -d v1.0.0
git tag -a v1.0.0 -m "New message"

远程标签不同步

bash
git fetch --tags --prune-tags

如何找到包含某提交的标签

bash
git tag --contains <commit-hash>

如何查看标签指向的提交

bash
git rev-list -n 1 v1.0.0

总结

  • 标签用于标记重要的提交,如版本发布
  • 推荐使用附注标签进行正式发布
  • 遵循语义化版本命名规范
  • 及时推送标签到远程仓库
  • 使用 GPG 签名提高安全性
  • 设置标签保护规则防止误删