6、Git标签管理:标签概念、创建标签、查看标签、删除标签、推送标签

标签这个东西,说白了就是给某个提交打个「记号」。

我刚开始用Git的时候,总觉得标签和分支差不多。后来踩了坑才明白——分支会变,标签不会。你想想看,分支像一根绳子,随着你提交不断往前拽;标签呢,就像个钉子,钉死在某个历史节点上,永远不动。

6.1 标签到底是什么?

标签(Tag)是Git里用来标记特定提交的引用。最常见的用途就是标记版本号,比如 v1.0.0v2.3.1-release

我个人习惯,每次发布正式版本前,一定会打一个标签。为什么?因为以后出问题了,我能一秒切回那个版本的代码,查看到底哪里改坏了。

核心区别:

  • 分支:指向最新提交,会随着新提交移动
  • 标签:指向固定提交,创建后不会变

Git标签分两种:

  • 轻量标签(Lightweight):就是个指针,只存提交的哈希值
  • 附注标签(Annotated):包含打标签的人、时间、备注信息,还能用GPG签名

我建议你——正式项目里,永远用附注标签。轻量标签说白了就是个临时记号,丢了都不知道谁打的。

Git标签 vs 分支 对比图 C1 C2 C3 C4 C5 main v1.0 v2.0 分支 main 指向最新提交 C5 标签 v1.0 钉死在 C3,永不移动 标签 v2.0 钉死在 C5,永不移动

6.2 创建标签

6.2.1 创建轻量标签

git tag v1.0.0-lw

就这么简单。但你看,它连个备注都没有。我当年刚学Git时,就喜欢这么打标签。结果三个月后回来看,完全想不起来这个版本改了啥。

6.2.2 创建附注标签(推荐)

git tag -a v1.0.0 -m "正式发布v1.0.0版本,修复了登录模块的bug"

-a 表示 annotated(附注),-m 后面写备注。嗯,这里要注意——备注一定要写清楚这个版本的核心变化

我的习惯:

备注格式:[版本号] - [主要变更]

比如:v2.1.0 - 新增支付模块,重构用户权限系统

6.2.3 给历史提交打标签

有时候你忘了打标签,回头想补一个。没问题:

git tag -a v0.9.0 9fceb02 -m "补打v0.9.0,对应旧版API"

这里的 9fceb02 是提交哈希的前几位。怎么找到它?用 git log --oneline 看。

我曾经有个项目,上线半年后发现少打了三个版本标签。当时就是靠这个命令一个个补回去的。说实话,挺狼狈的——所以还是养成习惯,发布时立刻打标签。

6.3 查看标签

6.3.1 列出所有标签

git tag

输出按字母排序:

v0.9.0
v1.0.0
v1.1.0
v2.0.0

6.3.2 按模式搜索

git tag -l "v1.*"

只显示 v1 开头的标签。项目标签多了以后,这个命令特别实用。

6.3.3 查看标签详情

git show v1.0.0

轻量标签只会显示提交信息。附注标签会额外显示:

  • 打标签的人
  • 打标签的时间
  • 备注信息
  • GPG签名(如果有)

小技巧:

git tag -n 可以同时看到标签名和备注的第一行,适合快速浏览。

6.4 删除标签

6.4.1 删除本地标签

git tag -d v1.0.0-lw

-d 就是 delete。删完就没了,所以删之前确认一下。

注意:

如果标签已经推送到远程仓库,本地删除后远程还在。需要额外操作。

6.4.2 删除远程标签

git push origin --delete v1.0.0-lw

或者用这种写法:

git push origin :refs/tags/v1.0.0-lw

我个人更推荐第一种,意思更清楚。第二种写法太像「推送空内容覆盖标签」,容易让人困惑。

6.5 推送标签

默认情况下,git push 不会推送标签。你得手动推。

6.5.1 推送单个标签

git push origin v1.0.0

6.5.2 推送所有标签

git push origin --tags

嗯,这里要注意——--tags 会把本地所有标签一股脑推上去。我建议你慎用。为什么?

有一次我在本地打了几个测试标签,比如 test-1test-2,然后手一抖 git push origin --tags……好家伙,远程仓库里全是垃圾标签。后来还得一个个删,麻烦得很。

我的建议:

正式标签一个一个推。测试标签不要推远程,本地用完就删。

6.6 标签管理最佳实践

场景 推荐做法 原因
正式发布 附注标签 + 详细备注 保留完整元信息,方便回溯
内部测试 轻量标签 临时标记,用完即删
补打历史标签 附注标签 + 注明补打 避免后人疑惑为什么标签时间不对
推送标签 逐个推送 避免把测试标签也推上去

最后说一句——标签这东西,平时用着觉得没啥。但一旦项目出问题,需要回滚到某个历史版本时,你就会发现:有标签和没标签,完全是两个世界

我曾经接手过一个项目,代码里没有任何标签。想找「上一个稳定版本」?只能靠猜。后来我花了整整一个下午,翻提交记录,才找到那个版本。从那以后,我每个项目都强制要求打标签。

说白了,标签就是给你的代码历史「立碑」。立好了,后人(包括未来的你)会感谢你的。

一句话总结:

用附注标签,写清楚备注,发布即打标签,推送逐个来。


公众号:蓝海资料掘金营,微信deep3321