掌握 Git Tag 的创建、查看、推送和删除,学会用语义化版本管理规范项目发布。

Tag — 给历史提交打上一个永久的标记

分支会随着开发不断前进,但 Tag 是固定在某个提交上的标记,永远不会移动。它最常见的用途就是标记版本号:v1.0.0v2.1.3


一、什么是 Tag?

Tag 是给某个提交打上的不可移动的标签。即使后续有新提交,Tag 始终指向它被创建时的那个提交。

1
A → B → C (tag: v1.0.0) → D → E (tag: v1.1.0) → F (HEAD)

Tag vs Branch

特性TagBranch
是否移动固定不动随提交前进
用途标记版本、里程碑日常开发
能否切换可以 checkout 查看可以 checkout 开发
命名习惯v1.0.0mainfeature/xxx

二、两种 Tag 类型

类型说明包含信息
轻量标签(lightweight)只是一个指针,类似分支仅指向一个提交
附注标签(annotated)完整的 Git 对象包含标签名、作者、日期、说明

推荐:版本发布用附注标签,它包含完整的元信息,方便追溯。


三、创建 Tag

附注标签(推荐)

1
2
3
4
5
# 在当前提交上创建
git tag -a v1.0.0 -m "Release v1.0.0 - 首个正式版"

# 在指定提交上创建
git tag -a v0.9.0 -m "Beta 版本" abc1234
参数含义
-a--annotate,创建附注标签
-m--message,标签说明信息

轻量标签

1
2
# 只打标记,没有说明
git tag v1.0.0

签名标签(GPG 签名)

1
2
# -s 使用 GPG 签名,确保标签可信
git tag -s v1.0.0 -m "Signed release v1.0.0"

四、查看 Tag

列出所有 Tag

1
2
3
4
5
6
7
8
9
10
# 列出全部
git tag

# 按模式过滤(查看 v1.x 系列)
git tag -l "v1.*"

# 输出示例:
# v1.0.0
# v1.1.0
# v1.2.0

查看 Tag 详情

1
2
3
4
5
6
7
8
9
10
11
# 查看某个标签的信息
git show v1.0.0

# 输出:
# tag v1.0.0
# Tagger: John <john@example.com>
# Date: Mon Jun 8 10:00:00 2026
#
# Release v1.0.0 - 首个正式版
#
# commit abc1234...

查看 Tag 对应的提交

1
2
3
# 简洁输出
git log --oneline --tags --decorate
# a1b2c3d (tag: v1.0.0, HEAD -> main) feat: 完成登录功能

五、推送 Tag 到远程

Tag 不会自动推送git push 默认只推送分支,不推送 Tag。你需要手动推送。

推送单个 Tag

1
git push origin v1.0.0

推送所有 Tag

1
git push origin --tags

在 push 时自动推送 Tag

1
2
# 全局配置:push 时自动带上 Tag
git config --global push.followTags true
推荐

push.followTags 只会推送有对应提交的附注标签,不会推送轻量标签和无关 Tag。


六、删除 Tag

删除本地 Tag

1
git tag -d v1.0.0

删除远程 Tag

1
2
3
4
5
# 方法1:用 refspec 语法
git push origin --delete v1.0.0

# 方法2:旧语法(效果相同)
git push origin :refs/tags/v1.0.0

删除远程 Tag 需谨慎:如果别人已经 pull 过这个 Tag,他们本地仍然保留。需要所有人各自删除,或者通知团队同步。


七、切换到 Tag

Tag 不能像分支一样直接 checkout 后开发,但你可以查看该版本代码或基于它创建新分支。

查看 Tag 的代码(游离头指针)

1
2
3
4
5
git checkout v1.0.0

# 提示:
# Note: switching to 'v1.0.0'.
# You are in 'detached HEAD' state.
注意

游离头指针(detached HEAD)状态下的提交不属于任何分支,切换走就丢了。只适合查看代码,不适合开发。

基于 Tag 创建新分支(推荐)

1
2
# 基于 v1.0.0 创建一个 hotfix 分支
git checkout -b hotfix/login-bug v1.0.0

这常用于给旧版本打补丁:用户还在用 v1.0,但 main 已经开发到 v2.0 了,你基于 v1.0 的 Tag 创建 hotfix 分支修复问题。


八、语义化版本号(SemVer)

Tag 命名推荐使用语义化版本号:v主版本.次版本.修订号

部分含义什么时候加
主版本(Major)不兼容的 API 变更大重构、破坏性改动
次版本(Minor)向下兼容的新功能新功能、新接口
修订号(Patch)向下兼容的 Bug 修复修 Bug、小优化
1
2
3
v1.0.0 → v1.0.1    ← 修了个 Bug
v1.0.1 → v1.1.0 ← 加了新功能
v1.1.0 → v2.0.0 ← 有破坏性改动

预发布版本

1
2
3
4
v1.0.0-alpha.1     ← 内测版
v1.0.0-beta.2 ← 公测版
v1.0.0-rc.1 ← 候选发布版(Release Candidate)
v1.0.0 ← 正式版

九、实战:完整发布流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 确保代码是最新的
git checkout main
git pull origin main

# 2. 运行测试,确认没有问题
npm test

# 3. 创建附注标签
git tag -a v1.0.0 -m "Release v1.0.0

- 用户登录注册功能
- 首页数据展示
- API 接口文档"

# 4. 推送到远程
git push origin v1.0.0

# 5. 或者推送代码同时推送标签
git push origin main --follow-tags

在 GitHub/Gitee 上创建 Release

推送 Tag 后,在仓库页面可以看到该 Tag,点击可以创建 Release:

  • 填写版本说明
  • 上传构建产物(如 .jar.exe
  • 标记是否为预发布版本

总结:Tag 速查卡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
┌──────────────────────────────────────────────────────────┐
│ Git Tag 速查 │
├────────────────┬─────────────────────────────────────────┤
│ 创建附注标签 │ git tag -a v1.0.0 -m "说明" │
│ 创建轻量标签 │ git tag v1.0.0 │
│ 在指定提交创建 │ git tag -a v1.0.0 <hash> -m "说明" │
├────────────────┼─────────────────────────────────────────┤
│ 查看所有标签 │ git tag / git tag -l "v1.*" │
│ 查看标签详情 │ git show v1.0.0 │
├────────────────┼─────────────────────────────────────────┤
│ 推送单个标签 │ git push origin v1.0.0 │
│ 推送所有标签 │ git push origin --tags │
│ 自动跟随推送 │ git config --global push.followTags true │
├────────────────┼─────────────────────────────────────────┤
│ 删除本地标签 │ git tag -d v1.0.0 │
│ 删除远程标签 │ git push origin --delete v1.0.0 │
├────────────────┼─────────────────────────────────────────┤
│ 基于标签建分支 │ git checkout -b hotfix v1.0.0 │
└────────────────┴─────────────────────────────────────────┘