跳到主要内容

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从标签创建分支

小结

本章我们学习了:

  1. 标签类型:轻量标签和附注标签的区别与选择
  2. 创建标签:为当前提交或历史提交打标签
  3. 管理标签:查看、推送、删除标签
  4. 语义化版本:版本号命名规范
  5. 发布工作流:使用标签进行版本发布

标签是版本管理的核心工具,正确使用标签可以让你的发布历史清晰可追溯。

练习

  1. 为你的项目创建一个附注标签,包含详细的发布说明
  2. 练习删除和重新创建标签
  3. 从一个标签创建分支,进行修复,然后创建新的标签
  4. 比较两个标签之间的差异

参考资料