Git 标签管理
标签(Tag)用于在 Git 历史中标记特定的提交。与分支不同,标签是静态的引用,一旦创建就不会移动。标签通常用于标记发布版本、重要里程碑或其他需要快速定位的提交点。
为什么使用标签?
在实际开发中,你可能需要回答这些问题:
- "我们上周发布的 v1.2.0 对应哪个提交?"
- "生产环境当前运行的是哪个版本?"
- "这个紧急修复是在哪个版本之后引入的?"
标签提供了一种给重要提交起"名字"的方式,让你可以用 v1.0.0 而不是 a1b2c3d 来引用特定的提交。
标签在历史中的位置
标签创建后永远指向同一个提交。即使后续有新的提交,标签也不会移动,这与分支形成鲜明对比。
标签类型
Git 支持两种类型的标签:
轻量标签(Lightweight Tag)
轻量标签只是一个指向特定提交的引用,不包含额外信息:
git tag v1.0.0
轻量标签本质上就是一个"书签",只记录了它指向的提交。
适用场景:
- 临时标记某个提交
- 个人使用的本地标签
- 快速创建的测试标签
附注标签(Annotated Tag)
附注标签是 Git 数据库中的完整对象,包含丰富的元数据:
git tag -a v1.0.0 -m "版本 1.0.0 正式发布"
附注标签包含的信息:
- 标签名称
- 标签信息(描述)
- 创建者姓名和邮箱
- 创建时间
- 可选的 GPG 签名
适用场景:
- 正式的版本发布
- 需要记录详细信息的里程碑
- 团队共享的标签
如何选择?
| 场景 | 推荐标签类型 |
|---|---|
| 正式版本发布 | 附注标签 |
| 团队共享的标签 | 附注标签 |
| 临时本地标记 | 轻量标签 |
| 个人备忘 | 轻量标签 |
建议:对于任何重要的、需要共享的标签,都使用附注标签。
创建标签
创建轻量标签
# 为当前提交创建轻量标签
git tag v1.0.0
# 为特定提交创建轻量标签
git tag v0.9.0 abc123
创建附注标签
# 为当前提交创建附注标签
git tag -a v1.0.0 -m "版本 1.0.0 正式发布
主要更新:
- 添加用户登录功能
- 优化数据库查询性能
- 修复若干已知问题"
# 为特定提交创建附注标签
git tag -a v0.9.0 -m "版本 0.9.0 Beta" abc123
创建签名标签
对于安全性要求高的项目,可以使用 GPG 签名标签:
# 创建 GPG 签名的附注标签
git tag -s v1.0.0 -m "版本 1.0.0 正式发布"
# 验证签名
git tag -v v1.0.0
签名标签可以证明标签确实由声称的人创建,防止伪造。
后期补打标签
有时候你忘记在发布时打标签,可以事后补打:
# 查找需要打标签的提交
git log --oneline
# 找到目标提交后补打标签
git tag -a v1.0.0 abc123 -m "版本 1.0.0"
查看标签
列出标签
# 列出所有标签
git tag
# 按模式筛选标签
git tag -l "v1.*" # 列出 v1.0, v1.1, v1.2 等
git tag -l "*-rc*" # 列出所有包含 rc 的标签
# 查看标签详情
git show v1.0.0
# 只显示标签信息(不显示提交差异)
git show v1.0.0 --no-patch
查看标签指向的提交
# 查看标签指向的提交哈希
git rev-parse v1.0.0
# 查看标签指向的提交信息
git log -1 v1.0.0
# 比较两个标签之间的差异
git diff v1.0.0..v1.1.0
# 查看两个标签之间的提交历史
git log v1.0.0..v1.1.0 --oneline
共享标签
推送标签到远程
# 推送单个标签
git push origin v1.0.0
# 推送所有标签
git push origin --tags
# 推送所有标签和分支
git push --follow-tags origin main
注意:git push 默认不会推送标签,需要显式推送。
推送策略
推荐的做法:
# 只推送附注标签(不推送轻量标签)
git push --follow-tags
# 这需要在配置中设置
git config --global push.followTags true
从远程获取标签
# 获取所有远程标签
git fetch --tags
# 获取单个标签
git fetch origin tag v1.0.0
# 克隆时获取所有标签
git clone --tags <url>
删除标签
删除本地标签
# 删除本地标签
git tag -d v1.0.0
# 删除多个标签
git tag -d v1.0.0 v1.0.1 v1.0.2
删除远程标签
# 方法一:使用 --delete
git push origin --delete v1.0.0
# 方法二:推送空引用
git push origin :refs/tags/v1.0.0
# 方法三:删除本地后同步删除远程
git tag -d v1.0.0
git push origin :refs/tags/v1.0.0
批量删除标签
# 删除所有本地标签
git tag -d $(git tag -l)
# 删除所有远程标签
git push origin --delete $(git tag -l)
# 删除特定模式的标签
git tag -d $(git tag -l "v0.*")
检出标签
检出标签(分离 HEAD 状态)
git checkout v1.0.0
这会让仓库进入"分离 HEAD"状态,HEAD 直接指向标签所指向的提交。在这种状态下,任何新的提交都不属于任何分支,切换分支后可能会丢失。
从标签创建分支
如果你需要在某个标签的基础上进行修改:
# 创建新分支并切换
git checkout -b hotfix-v1.0.0 v1.0.0
# 或者使用 switch 命令
git switch -c hotfix-v1.0.0 v1.0.0
创建分支后,你可以在该分支上进行修复工作,然后发布新的版本。
语义化版本
语义化版本(Semantic Versioning)是一种版本命名规范,格式为 MAJOR.MINOR.PATCH:
- MAJOR(主版本号):不兼容的 API 变更
- MINOR(次版本号):向后兼容的功能新增
- PATCH(修订号):向后兼容的问题修复
版本号示例
v1.0.0 → 初始版本
v1.0.1 → 修复 bug
v1.1.0 → 新增功能
v2.0.0 → 重大更新,不兼容 v1.x
v2.0.1 → 修复 bug
v2.1.0 → 新增功能
预发布版本
v1.0.0-alpha → 内部测试版
v1.0.0-beta → 公开测试版
v1.0.0-rc.1 → 发布候选版
v1.0.0 → 正式版
标签命名规范
# 正式版本
v1.0.0
v2.1.3
# 预发布版本
v1.0.0-alpha.1
v1.0.0-beta.2
v1.0.0-rc.1
# 特殊构建
v1.0.0+build.123
发布工作流
使用标签进行版本发布
# 1. 确保在正确的分支
git checkout main
# 2. 拉取最新代码
git pull origin main
# 3. 创建发布标签
git tag -a v1.0.0 -m "版本 1.0.0 正式发布
新功能:
- 用户登录系统
- 数据导出功能
改进:
- 性能优化
- UI 改进
修复:
- 修复登录超时问题"
# 4. 推送标签
git push origin v1.0.0
# 5. 在 GitHub/GitLab 上基于标签创建 Release
自动化发布示例
使用脚本自动创建标签和发布:
#!/bin/bash
# release.sh
VERSION=$1
if [ -z "$VERSION" ]; then
echo "用法: ./release.sh <version>"
echo "示例: ./release.sh v1.0.0"
exit 1
fi
# 确保在 main 分支
git checkout main
# 拉取最新代码
git pull origin main
# 更新版本号(假设使用 package.json)
if [ -f "package.json" ]; then
npm version $VERSION --no-git-tag-version
git add package.json package-lock.json
fi
# 提交版本更新
git commit -m "chore: 发布 $VERSION"
# 创建标签
git tag -a $VERSION -m "发布 $VERSION"
# 推送提交和标签
git push origin main
git push origin $VERSION
echo "✅ 发布 $VERSION 完成"
标签与分支的关系
标签和分支都是引用,但行为不同:
关键区别:
| 特性 | 标签 | 分支 |
|---|---|---|
| 是否移动 | 否(静态) | 是(动态) |
| 用途 | 标记特定版本 | 开发工作线 |
| 可否提交 | 否 | 是 |
| 创建成本 | 很低 | 很低 |
| 推送方式 | 需显式推送 | git push 自动推送 |
常用标签命令速查
| 命令 | 说明 |
|---|---|
git tag | 列出所有标签 |
git tag v1.0.0 | 创建轻量标签 |
git tag -a v1.0.0 -m "msg" | 创建附注标签 |
git tag -a v1.0.0 abc123 | 为特定提交打标签 |
git tag -d v1.0.0 | 删除本地标签 |
git push origin v1.0.0 | 推送标签 |
git push origin --tags | 推送所有标签 |
git push origin --delete v1.0.0 | 删除远程标签 |
git show v1.0.0 | 查看标签详情 |
git checkout v1.0.0 | 检出标签 |
git checkout -b branch v1.0.0 | 从标签创建分支 |
小结
本章我们学习了:
- 标签类型:轻量标签和附注标签的区别与选择
- 创建标签:为当前提交或历史提交打标签
- 管理标签:查看、推送、删除标签
- 语义化版本:版本号命名规范
- 发布工作流:使用标签进行版本发布
标签是版本管理的核心工具,正确使用标签可以让你的发布历史清晰可追溯。
练习
- 为你的项目创建一个附注标签,包含详细的发布说明
- 练习删除和重新创建标签
- 从一个标签创建分支,进行修复,然后创建新的标签
- 比较两个标签之间的差异