git tag 给某次提交打一个固定的名字,通常用来标记发布版本(v1.2.0)。它与分支的区别是:分支指针会随提交前移,标签永远指向那个提交。

本文列出 git tag 的常用参数,说明轻量标签与附注标签的区别、如何排序、如何推送和删除远端标签。

ℹ️
关于本系列
本文是《Git 使用教程》按命令拆分的第 22 / 28 篇,全部收录在 Git 栏目。参数表列的是日常高频项,并非穷举;想看某个命令的完整参数,用 git tag -h 看精简列表、git help tag 看完整手册。示例以 Git 2.56.0 为准。

一、命令语法

先看语法骨架,再对照下一节的参数表。<占位> 表示必填值,实际输入时不要带尖括号;[...] 表示可选项,-- 用来分隔选项与路径。

bash语法
git tag [-a | -s] <tagname> [<commit>] [-m <msg>]
git tag -l [<pattern>]
git tag -d <tagname>...

二、参数逐项详解

下表按用途列出 git tag 的常用参数,每项都注明了「它到底改变了什么」。

参数作用
<tagname>不带 -a 时创建轻量标签,只是一个指向提交的引用
-a <名> / --annotate创建附注标签,含打标签者、日期与说明,发布版本首选
-m <信息> / --message直接给附注标签写说明,免去打开编辑器
-s / --sign用 GPG 给标签签名
-v / --verify验证标签的 GPG 签名
-l <模式> / --list列出标签,支持通配符,如 git tag -l "v1.*"
-d / --delete删除本地标签
-f / --force强制覆盖同名标签(改名要谨慎,已发布的别覆盖)
--sort=<键>排序,版本号倒序常用 --sort=-version:refname
-n<行数>列出标签时附带前 n 行说明
--contains <commit>只列包含该提交的标签,查「这个修复发布在哪个版本」很好用
--merged / --no-merged <commit>按是否已合并进指定提交过滤
<commit>给历史中某次提交补打标签,默认打在 HEAD

轻量标签 vs 附注标签

对比轻量标签附注标签
创建方式git tag v1.0git tag -a v1.0 -m "..."
存的内容只是一个引用独立对象,含作者、日期、说明、可签名
推荐场景本地临时标记正式发布、需要签名或追溯

三、常用示例

发布打标签

bash发布打标签
git tag -a v1.2.0 -m "release 1.2.0"
git tag -l "v1.*" --sort=-version:refname
git show v1.2.0 --stat
git push origin v1.2.0

给历史提交补标签 / 查归属

bash给历史提交补标签 / 查归属
git tag -a v1.1.9 a1b2c3d -m "补打 1.1.9"
git tag --contains a1b2c3d
git push --tags

删除标签

bash删除标签
git tag -d v1.2.0
git push origin --delete v1.2.0
# 或 git push origin :refs/tags/v1.2.0

四、注意事项

⚠️
标签默认不会随 push 上传
git push 只推分支,要显式 git push origin v1.2.0 或 git push --tags(后者会把所有本地标签推上去,容易把临时标签也带出去)。更推荐 push.followTags=true 配合显式推附注标签。
已发布的标签不要 -f 覆盖: 别人可能已经基于它构建了产物。发现打错版本时,正确做法是删掉后重新沟通,或直接发一个新的补丁版本标签。

五、小结

git tag 的参数围绕「建 / 列 / 删」三件事,真正需要决策的只有一处:正式发布一律用 -a 附注标签。再记住标签要单独 push、已发布的不覆盖,就够了。

本系列共 28 篇,一个命令一篇,完整目录见 Git 栏目。下一篇:git remote 命令参数详解。