讲解

分支会移动,标签(tag)则是一个永远钉死在某个提交上的名字,专门用来标记重要的历史节点——最典型的就是发布版本:v1.0.0、v2.3.1。有了标签,「线上跑的是哪个版本」就从模糊的「某个提交」变成一句 git describe 或一个清晰的名字;要紧急回滚或排查线上问题,git switch --detach v1.0.0 直接回到那个版本。

Git 的标签分两种:轻量标签(lightweight)只是一个指向提交的名字,git tag v1.0.0 就完事;附注标签(annotated)是一个完整的对象,包含打标签的人、时间和一段说明信息,git tag -a v1.0.0 -m "第一个正式版本"。发布版本一律用附注标签,它才是「发布记录」;轻量标签适合临时书签。版本号本身推荐语义化版本(SemVer):主版本.次版本.修订号,破坏性变更升级主版本、新功能升级次版本、修 bug 升级修订号。

标签的日常操作:git tag 列出所有标签,git tag --list 'v1.*' 按模式过滤;git show v1.0.0 查看标签指向的提交和说明;git tag -a v0.9.0 哈希 -m "..." 给历史提交补打标签;git tag -d 名字 删除本地标签。推送到远程要显式进行:git push origin v1.0.0 推单个,git push --tags 推全部;删除远程标签用 git push origin --delete v1.0.0。托管平台(GitHub 等)还能基于标签创建 Release,附上发布说明和二进制包。

示例

git tag
git tag -a v1.0.0 -m "第一个正式版本"
git tag --list
git show v1.0.0 --stat
git tag -a v0.9.0 -m "补打的历史版本" HEAD~2
git tag --list 'v0.*'
git tag -d v0.9.0
git tag

仓库里已有的 v0.1.0 是初始化时打的轻量标签;新打的 v1.0.0 是附注标签,git show 能看到标签说明和打标签人。推送标签的写法(示意):

# 仅示意:标签默认不随分支推送,需要显式操作
git push origin v1.0.0
git push --tags
git push origin --delete v0.9.0

常见坑

  • 以为 push 分支会带上标签:默认不会,标签必须单独 push。队友看不到你发布的版本,多半是忘了这一步。
  • 标签打了又改:移动已推送的标签(删除重打)会让已拉取的人拿到不一致的历史。标签和提交一样,推送出去就视为不可变;版本有问题就发新版本号。
  • 版本号随口起:v1、新版、final 这类标签在需要精确回滚时毫无帮助。统一语义化版本,并与项目里的版本号(package.json 等)保持一致。
  • 删除远程标签姿势不对:git tag -d 只删本地;远程的要 git push origin --delete,两步都做才删干净。

小结

标签是钉在提交上的固定名字,发布用附注标签 + 语义化版本;push/delete 远程标签都是显式操作。下一章学习从一个分支「摘取」单个提交:cherry-pick。