6、Git标签管理:标签概念、创建标签、查看标签、删除标签、推送标签
标签这个东西,说白了就是给某个提交打个「记号」。
我刚开始用Git的时候,总觉得标签和分支差不多。后来踩了坑才明白——分支会变,标签不会。你想想看,分支像一根绳子,随着你提交不断往前拽;标签呢,就像个钉子,钉死在某个历史节点上,永远不动。
6.1 标签到底是什么?
标签(Tag)是Git里用来标记特定提交的引用。最常见的用途就是标记版本号,比如 v1.0.0、v2.3.1-release。
我个人习惯,每次发布正式版本前,一定会打一个标签。为什么?因为以后出问题了,我能一秒切回那个版本的代码,查看到底哪里改坏了。
核心区别:
- 分支:指向最新提交,会随着新提交移动
- 标签:指向固定提交,创建后不会变
Git标签分两种:
- 轻量标签(Lightweight):就是个指针,只存提交的哈希值
- 附注标签(Annotated):包含打标签的人、时间、备注信息,还能用GPG签名
我建议你——正式项目里,永远用附注标签。轻量标签说白了就是个临时记号,丢了都不知道谁打的。
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-1、test-2,然后手一抖 git push origin --tags……好家伙,远程仓库里全是垃圾标签。后来还得一个个删,麻烦得很。
我的建议:
正式标签一个一个推。测试标签不要推远程,本地用完就删。
6.6 标签管理最佳实践
| 场景 | 推荐做法 | 原因 |
|---|---|---|
| 正式发布 | 附注标签 + 详细备注 | 保留完整元信息,方便回溯 |
| 内部测试 | 轻量标签 | 临时标记,用完即删 |
| 补打历史标签 | 附注标签 + 注明补打 | 避免后人疑惑为什么标签时间不对 |
| 推送标签 | 逐个推送 | 避免把测试标签也推上去 |
最后说一句——标签这东西,平时用着觉得没啥。但一旦项目出问题,需要回滚到某个历史版本时,你就会发现:有标签和没标签,完全是两个世界。
我曾经接手过一个项目,代码里没有任何标签。想找「上一个稳定版本」?只能靠猜。后来我花了整整一个下午,翻提交记录,才找到那个版本。从那以后,我每个项目都强制要求打标签。
说白了,标签就是给你的代码历史「立碑」。立好了,后人(包括未来的你)会感谢你的。
一句话总结:
用附注标签,写清楚备注,发布即打标签,推送逐个来。