git rev-list 是提取两版本间提交 id 的核心工具,配合 git log、git show 等可生成结构化发布日志;支持 --reverse、--no-merges、路径过滤,并能解析 jira 编号、conventional commits 类型等元信息。

直接用 git rev-list 配合其他 Git 命令,就能高效提取两个生产版本间所有提交的结构化信息,用于生成发布日志。关键不是只用 rev-list,而是把它作为“提交 ID 生成器”,再结合 git log、git show 等命令做格式化输出。
明确版本范围并获取提交列表
git rev-list 的核心作用是按时间倒序列出指定区间内的所有 commit SHA-1(或 SHA-256)哈希值。它不展示内容,只输出 ID —— 这正是自动化脚本需要的“纯净输入”。
- 假设旧版 tag 是
v2.1.0,新版是v2.2.0,运行:git rev-list v2.1.0..v2.2.0 --reverse
--reverse 让结果从旧到新排列,符合发布日志阅读习惯。 - 若使用分支名(如
prod-2024-q2和prod-2024-q3),语法一致:git rev-list prod-2024-q2..prod-2024-q3 --reverse - 排除合并提交(避免日志冗余)可加 --no-merges;只包含某目录变更加路径限制,例如
-- src/backend/。
用 Git Log 格式化输出可读日志
把 rev-list 输出的 commit ID 流,传给 git log 做定制化渲染,比单独调用 log 更可控(尤其在 CI 环境中避免因 reflog 或本地配置差异导致结果不一致)。
- 典型命令组合:
git rev-list v2.1.0..v2.2.0 --reverse | xargs -r git log -1 --pretty=format:"%h %ad %s [%an]" --date=short
其中-1表示每个 commit 只输出一行摘要,%h是短哈希,%ad是作者日期,%s是标题,%an是作者名。 - 想导出为 Markdown 表格,可进一步处理:
git rev-list v2.1.0..v2.2.0 --no-merges --reverse | while read cid; do echo "| \`$cid\` | \$(git log -1 --format='%s' $cid) | \$(git log -1 --format='%an' $cid) |"; done - 注意:确保工作区 clean 或使用
--git-dir指向裸仓库,避免因本地修改影响结果。
提取关联信息增强日志实用性
真实发布日志常需关联 Jira 编号、变更类型(feat/fix/chore)、影响模块等。这些信息可通过解析 commit message 实现自动化提取。
- 匹配 Jira ID(如
PROJ-123):git log -1 --format='%s' $cid | grep -oE '[A-Z]+-[0-9]+' || echo "N/A" - 识别 Conventional Commits 类型(如
feat(api): add timeout):git log -1 --format='%s' $cid | sed -n 's/^\([a-z]*\)([^)]*): .*/\1/p; t; s/^[a-z]*: .*/other/p' - 检查是否含测试变更:
git diff-tree --no-commit-id --name-only -r $cid | grep -q '\.test\.js\|__tests__/' && echo "✅ test" || echo "–"
集成进发布流水线生成最终日志文件
将上述逻辑封装为 Bash 脚本或 Makefile 目标,在 CI/CD(如 GitHub Actions、GitLab CI)中作为发布前最后一步执行。
- 示例脚本片段(保存为
gen-release-log.sh):#!/bin/bash<br>OLD=$1<br>NEW=$2<br>OUT="release-log-$OLD-to-$NEW.md"<br>echo "# Release Log: $OLD → $NEW" > $OUT<br>echo "" >> $OUT<br>git rev-list $OLD..$NEW --no-merges --reverse | while read cid; do<br> subj=$(git log -1 --format='%s' $cid)<br> jira=$(git log -1 --format='%s' $cid | grep -oE '[A-Z]+-[0-9]+' | head -1)<br> echo "- \`${cid:0:7}\` $subj ${jira:+($jira)}" >> $OUT<br>done - CI 中调用:
bash gen-release-log.sh v2.1.0 v2.2.0 && git add release-log-*.md && git commit -m "chore: add release log" - 建议将日志同时上传为构建产物(Artifacts),便于 QA 和运维查阅。











