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 结合
- 推送标签自动触发 CI 构建。
- 构建产物(二进制包/Docker 镜像)自动上传到 Release。
- 从最近标签间的提交历史自动生成 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 · 试卷/发票打印神器 · 免费 |
💡 小程序【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 暂存恢复保护现场

