Nestjs集成standard-version合并分支后CHANGELOG缺失提交问题
standard-version 默认依赖conventional-changelog解析提交历史,但如果用 GitHub 默认的「创建合并提交」方式合并分支,分支里的规范提交会被包裹在一个单独的合并提交中。默认配置下,工具只会遍历当前分支的直接提交节点,不会递归解析合并提交里的子提交;如果合并提交的信息不符合 conventional commit 规范(比如只是默认的Merge branch 'feat/xxx' into main),工具只会把这个合并提交当成普通提交处理,分支里的feat/fix等规范提交完全不会被扫描到。
1. 调整分支合并方式
推荐使用以下两种合并方式,让分支提交直接进入 main 历史:
- Rebase and merge:将分支的提交逐个应用到最新的 main 分支上,保留每个独立的规范提交,适合需要完整提交历史的场景。
- Squash and merge:把分支所有提交压缩成一个符合规范的提交(手动编辑提交信息为
feat(controller): Add new controller and update logic这类格式),这样 standard-version 能识别这个压缩后的提交,CHANGELOG 会显示一条汇总信息。
2. 修改 standard-version 配置解析合并提交
如果必须保留合并提交,可以在package.json里添加配置,让工具解析合并提交的子提交:
{ "standard-version": { "changelog": { "preset": "angular", "parserOpts": { "mergePattern": "^Merge branch '(.*)' into (.*)$", "mergeCorrespondence": ["branchName", "targetBranch"] } } } }
同时建议把合并提交的信息改成符合规范的格式,比如feat(controller): Merge branch 'feat/new-controller',提升工具识别率。不过这种方式兼容性不如调整合并方式稳定。
3. 分支合并前预生成 CHANGELOG
在开发分支完成后,先在分支上执行npx standard-version生成版本和 CHANGELOG,再合并到 main 分支,避免合并后提交历史被遮挡的问题。
1. NestJS CLI + conventional-changelog-cli
NestJS 官方 CLI 自带版本管理命令,配合常规变更日志工具完全适配生态:
- 安装依赖:
npm install -D conventional-changelog-cli - 在
package.json添加脚本:
执行{ "scripts": { "release": "conventional-changelog -p angular -i CHANGELOG.md -s && nest version patch" } }npm run release即可生成 CHANGELOG 并升级版本,angular预设和你之前的规范完全匹配。
2. release-it
灵活度更高的版本管理工具,支持 conventional commits,自定义配置友好:
- 安装:
npm install -D release-it @release-it/conventional-changelog - 在
package.json添加配置:
执行{ "release-it": { "git": { "commitMessage": "chore: release v${version}", "tagName": "v${version}" }, "plugins": { "@release-it/conventional-changelog": { "preset": "angular", "infile": "CHANGELOG.md" } } } }npx release-it就能自动生成 CHANGELOG、打标签、提交变更,支持交互式或全自动化运行。
3. semantic-release
自动化程度拉满的 CI/CD 专属工具,完全基于 GitHub Actions 运行,无需本地操作:
- 安装依赖:
npm install -D semantic-release @semantic-release/git @semantic-release/changelog - 在 GitHub Actions 工作流中配置后,它会自动识别规范提交、生成 CHANGELOG、打标签,甚至可以自动发布到 npm(如果需要),适合纯自动化的发布流程。
内容的提问来源于stack exchange,提问作者r00k13

