06. 给版本打上永久印记:Git 标签管理与发布实战

「Git」系列已发布: 00. 改崩代码不敢回退?Git 版本控制 3 分钟救你狗命 | 01. Git 装完不会配?Windows/macOS/Linux 三端配置一次到位 | 02. Git 配置总踩坑?全局/仓库/SSH 密钥一次搞懂 | 03. add/commit/push 别再死记:Git 工作流核心概念实操 | 04. Git 分支管理:5 步彻底搞懂 branch 与 merge | 05. clone/fetch/pull/push 分不清?Git 远程协作实战 | 06. 给版本打上永久印记:Git 标签管理与发布实战(本文) | 07. 切分支怕丢改动?Git stash 暂存恢复保护现场

Tag 是发布版本的锚点。轻量标签与附注标签的区别、创建推送删除、基于标签回滚——用标签把每一次发布钉死在历史里。

基础操作要熟(第 03 篇),分支管理要会(第 04 篇)。下面这些操作在本地仓库就能练,有远程仓库效果更完整。

一、标签是什么

标签(Tag)是一个指向特定提交的不可变引用,通常用来标记版本发布节点。和分支不同,标签建好之后不会随着后续提交移动——除非你显式删了重建。

Git 有两种标签:

类型 存了什么 什么时候用
轻量标签(Lightweight) 就一个指向提交的引用,41 字节的文件 临时标记、内部用
附注标签(Annotated) 完整 Git 对象:标签者、日期、说明、GPG 签名 正式版本发布

# 轻量标签
git tag v1.0.0-beta

# 附注标签——正式发布用这个
git tag -a v1.0.0 -m "正式发布 v1.0.0:包含用户认证模块重构和性能优化"

# 看标签详情
git show v1.0.0

# 附注标签会显示 tagger、日期、完整说明
# 轻量标签只显示对应提交的信息

1.1 标签基础操作

1.1.1 创建

# 在当前 HEAD 打标签
git tag -a v1.0.0 -m "版本说明"

# 给特定提交打
git tag -a v0.9.0 a3f2b1c -m "回溯标记 v0.9.0"

# 带 GPG 签名
git tag -s v1.0.0 -m "GPG 签名版本"

1.1.2 查看

# 列出所有标签
git tag

# 按模式过滤
git tag -l "v1.*"

# 看标签详情
git show v1.0.0

# 所有标签及对应提交(一行一条)
git tag -n

1.1.3 删除

# 删本地标签
git tag -d v1.0.0-beta

# 删远程标签
git push origin --delete v1.0.0-beta

# 或者推送空引用
git push origin :refs/tags/v1.0.0-beta

1.1.4 推送

# 推送单个标签
git push origin v1.0.0

# 推送所有本地标签
git push origin --tags

# 只推送附注标签,跳过轻量标签
git push --follow-tags

1.2 版本号怎么定

1.2.1 语义化版本(Semantic Versioning)

目前最通用的版本号规范,格式MAJOR.MINOR.PATCH:

v2.1.3

| | +-- PATCH:向后兼容的 bug 修复
| +---- MINOR:向后兼容的功能新增
+------ MAJOR:不兼容的 API 变更

版本号变化 什么时候 举例
MAJOR +1 做了不兼容的 API 改动 v2.0.0:重构了认证接口签名
MINOR +1 加了向后兼容的功能 v2.1.0:新增批量导出功能
PATCH +1 向后兼容的修复 v2.1.1:修复导出的编码问题

预发布标识:

v2.0.0-alpha.1    # 内部测试
v2.0.0-beta.2     # 公开测试

1.2.2 企业场景扩展

同时维护多个主版本时:

v2.3.1           # 当前稳定版
v2.3.2-hotfix.1  # v2.3 热修复

1.3 标签驱动 CI/CD

标签常作为 CI/CD 流水线的触发器。

1.3.1 GitLab CI

# .gitlab-ci.yml

build:
  stage: build
  script:
    - echo "Building version $CI_COMMIT_TAG"
  only:
    - tags
  release:
  stage: deploy
  script:
    - echo "Deploying $CI_COMMIT_TAG to production"
  only:
    - tags
  when: manual

1.3.2 GitHub Actions


# .github/workflows/release.yml

name: Release
on:
push:
  tags:
    - 'v*'
jobs:
build:
runs-on: ubuntu-latest
steps:
  - uses: actions/checkout@v4
  - name: Build
run: |
echo "Building version ${{ github.ref_name }}"

1.3.3 自动生成 CHANGELOG

# 两个标签之间的提交摘要
git log v1.0.0..v2.0.0 --oneline --no-merges

# 按约定式提交格式分类
git log v1.0.0..v2.0.0 --pretty=format:"- %s" --no-merges | sort

1.4 版本回溯与对比

# 标签指向的提交哈希
git rev-parse v1.0.0

# 两个版本间的文件差异总览
git diff v1.0.0 v2.0.0 --stat

# 某个文件在两个版本间的变化
git diff v1.0.0 v2.0.0 -- path/to/file.py

# 某个版本包含的所有文件
git ls-tree -r v1.0.0 --name-only

1.5 标签管理实践

1.5.1 命名约定

<MAJOR>.<MINOR>.<PATCH>[-<预发布标识>]

1.5.2 不可变性

标签推到远程后就当它是不可变的。真打错了的话:

# 1. 删远程旧标签
git push origin --delete v1.0.0

# 2. 删本地旧标签
git tag -d v1.0.0

# 3. 在新提交上重新打
git tag -a v1.0.0 -m "修正后的 v1.0.0 版本标记"

# 4. 推送新标签
git push origin v1.0.0

# 5. 通知团队成员更新
git fetch --tags --prune

前提是这个标签没被别人引用过。如果已经用于生产部署或第三方集成,别覆盖,递增版本号打一个新标签。

1.6 自动化标签

CI/CD 中自动打标签:

# 合并到 main 时自动打标签
auto-tag:
  stage: release
  script:
    - VERSION=$(cat VERSION)
    - git tag -a "v$VERSION" -m "自动发布 v$VERSION"
    - git push origin "v$VERSION"
  only:
    - main
  when: manual

1.6.1 标签与 Release 结合

  1. 推送标签自动触发 CI 构建。
  2. 构建产物(二进制包/Docker 镜像)自动上传到 Release。
  3. 从最近标签间的提交历史自动生成 Release Notes。

示例:从标签间提交生成 Release Notes

#!/usr/bin/env python3
import subprocess
def generate_changelog(from_tag, to_tag):
    cmd = f"git log {from_tag}..{to_tag} --pretty=format:'- %s (%an)' --no-merges"
    return subprocess.getoutput(cmd)
if __name__ == "__main__":
    print(generate_changelog("v1.0.0", "v2.0.0")

1.7 文章引用

📌 本文首发于微信公众号 【运维知识点滴】——专注运维实战干货,微信搜索“运维知识点滴”或扫下方二维码关注,更新不迷路。
📎 微信原文:06. 给版本打上永久印记:Git 标签管理与发布实战

微信公众号【运维知识点滴】 微信小程序【A5单据合并&大试卷拆分转A4打印】
运维实战干货 · 关注追更 Word 转 PDF · 试卷/发票打印神器 · 免费
运维实战干货 · 关注追更 Word 转 PDF · 试卷/发票打印神器 · 免费

💡 小程序【A5单据合并&大试卷拆分转A4打印】是干嘛的? 一个 Word 转 PDF 的打印神器,专治“文档版式和打印机对不上”:

  • A3 试卷打不出来? 学校发的电子版试卷多是 A3,家用打印机只吃 A4——上传 Word 一键转换:可缩到一页 A4(页数不变),也可对半拆成两张 A4(1:1 原大、字更清晰),两种模式自选;
  • 版式不乱:真实渲染引擎原样转换、绝不重排内容,转出的 PDF 和原 Word 排版一致,公式/表格/图片不跑版;
  • 两张 A5 单据拼一张 A4:出租车票、火车票等报销凭证拼版后,一次打印、整齐粘贴;
  • 隐私省心:无需注册,转换结果留存 5 天、最多下载 5 次即自动删除,不留任何历史记录;
  • 微信扫码即用,免费、免安装,支持 doc / docx(≤50MB)。

上一篇:05. clone/fetch/pull/push 分不清?Git 远程协作实战 | 下一篇:07. 切分支怕丢改动?Git stash 暂存恢复保护现场