直接运行 git tag 即可列出本地所有标签,按字母序排列,不区分轻量或附注类型;需先执行 git fetch --tags 同步远程标签,再用 git show 或 git tag -n 查看详情,删除时须先本地后远程。

怎么列出本地所有 Git 标签
直接运行 git tag 就能列出当前仓库所有已存在的本地标签,按字母顺序排列,不带任何前缀或格式。它只显示轻量标签(lightweight tag)和附注标签(annotated tag)的名称,不区分类型,也不显示提交信息。
常见错误是以为加了 -l 才算“列表”,其实 git tag 本身默认就是列出;git tag -l 是等价写法,但多此一举。如果想模糊匹配,比如找 v2.x 的标签,可以用 git tag -l "v2.*"。
- 标签不会自动从远程同步下来,
git tag只查本地数据库 - 输出为空?说明还没打过任何标签,不是命令错了
- 中文标签名可能显示乱码,跟终端编码和 Git 配置无关,是 Git 本身对非 ASCII 标签名支持较弱,建议避免
怎么把远程标签同步到本地
远程仓库的标签默认不会随 git fetch 或 git pull 自动下载——这是最容易被忽略的一环。必须显式拉取,否则 git tag 永远看不到别人打的标签。
最稳妥的做法是运行 git fetch --tags,它会从默认远程(通常是 origin)获取所有未在本地存在的标签,并创建对应引用。注意:它不会覆盖已有标签,也不会删除本地多余标签。
-
git pull不拉标签,哪怕你刚git push --tags到远程,别人也得自己git fetch --tags -
git fetch origin --tags和git fetch --tags效果一样,显式写origin更清晰 - 如果只想拉某个特定标签,用
git fetch origin tag/v1.2.3,但不会自动创建本地 tag 引用,需配合git tag v1.2.3 FETCH_HEAD
怎么看标签指向哪个提交、附带什么信息
单纯列名字不够,尤其当团队用附注标签记录发布说明时,得确认内容是否完整、签名是否有效。这时候不能只靠 git tag,得用 git show 或 git log 查细节。
git show <tagname></tagname> 最直接:如果是附注标签,会显示标签头(tagger、date、message)+ 提交对象的完整 diff;如果是轻量标签,则只显示对应提交的 commit 信息,没有额外元数据。
- 用
git tag -n可以在列表里顺带显示每条标签的第一行注释(仅限附注标签),但不会显示完整 message -
git log --tags --simplify-by-decoration --oneline能把标签和对应提交混排,适合看发布时间线 - 轻量标签无法验证签名,也无法通过
git verify-tag检查,这点在安全敏感场景必须注意
删除本地或远程标签的正确姿势
删标签不是 rm 文件那么简单,本地和远程要分开操作,且顺序不能反:先删本地,再推空引用到远程。否则容易出现“本地没了但远程还挂着”的脏状态。
删本地标签用 git tag -d <tagname></tagname>;删远程标签要用 git push origin :refs/tags/<tagname></tagname>(注意冒号前有空格)。Git 2.28+ 支持更直观的 git push origin --delete tag/<tagname></tagname>,但老版本不认。
- 别用
git push origin --tags补删——它只会强制推送所有本地标签,可能把刚删掉的又推回去 - 批量删本地标签:比如删所有 test-* 开头的,用
git tag -l "test-*" | xargs git tag -d - 远程标签删完后,其他人仍能看到,除非他们也执行
git fetch --prune --tags清理本地引用
标签管理真正的复杂点不在命令本身,而在于团队对“什么该打标签、什么时候打、打完要不要推”缺乏共识。一个没推的附注标签,和一个被 force-push 覆盖过的轻量标签,在协作中几乎等同于不存在。











