Appearance
标签管理
概述
标签(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 签名提高安全性
- 设置标签保护规则防止误删
