news 2026/5/7 9:47:40

Conventional Commits + CHANGELOG:开源协作里怎么写提交与发版说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Conventional Commits + CHANGELOG:开源协作里怎么写提交与发版说明

先说结论

维护者和贡献者吵得最不值当的架,有一半来自两句话没说清:

  • 这次合并到底改了什么?
  • 对用户来说,升级会不会踩雷?

Conventional Commits(约定式提交)解决「单次 commit 怎么一眼看懂」;CHANGELOG(变更日志)解决「版本与版本之间到底差在哪」。
二者都不绑定某一托管平台,GitHub、GitCode、Gitee 一样用——差别只在_release 按钮在哪,写作习惯是通用的。


一、为什么单靠「好好写中文 commit」往往不够

小团队可以靠口头同步;一旦进入开源协作:

  • PR 里 conversation 很长,评审结束后读者只看主线历史
  • 发版时要写 Release Notes,若平时 commit 杂乱,只能临时翻 diff,容易漏改、漏写破坏性变更

约定式提交的价值,是把信息嵌进机器可读 + 人可读的格式里,方便后续接 lint、生成文档、甚至自动化发版(可选)。


二、Conventional Commits:最小够用格式

核心结构就一行:

<类型>(可选作用域): <描述> [可选正文] [可选脚注]

1)常用类型(背这 6 个就够开工)

类型典型含义
feat新功能(往往对应次版本号 bump)
fix修复缺陷(往往对应补丁版本)
docs仅文档
chore构建/工具/杂项,不改变对外行为
refactor重构但不改行为
test测试相关

2)作用域(可选但很有用)

例子:fix(auth): handle expired refresh token
读者一眼知道动的是auth模块,而不是全局乱扫。

3)破坏性变更怎么写

必须在脚注或正文中显式声明,例如:

feat(api)!: remove legacy /v1/ping endpoint BREAKING CHANGE: clients must switch to /v2/ping

!在类型后是一种常见简写(工具链若支持会识别);无论如何,文字里写清 BREAKING CHANGE最稳妥。


三、和 SemVer 怎么「弱绑定」(心态要对)

语义化版本(SemVer:MAJOR.MINOR.PATCH)是发布策略;约定式提交是沟通格式。
二者常见约定(非强制全世界统一)是:

  • fix→ 多数情况 bumpPATCH
  • feat→ 多数情况 bumpMINOR
  • 破坏性变更→ bumpMAJOR

实际项目以你们RELEASE.md或自动化工具配置为准;新手记住:有破坏性变更就一定要在 CHANGELOG 里吼一声


四、CHANGELOG:推荐「Keep a Changelog」心智

不必一上来就上复杂工具。维护者最小可行路径是:

  1. 仓库根目录放CHANGELOG.md
  2. 每个版本一节,按Added / Changed / Fixed / Removed / Security分类(可以只用到其中几类)。
  3. 发版前把本周期内符合约定的 PR/commit归类抄进去

读者最关心三类信息:

  • 新增能力(要不要升级尝鲜)
  • 修复了啥坑(要不要立刻升级)
  • 不兼容点(升级前要改代码吗)

反例(尽量避免)

  • 只写「修复若干问题」——等于没说。
  • 把内部重构写满三屏——对外用户不关心。

五、可核对命令:从 git 历史里「抠」本次发布范围

发版前,维护者常用提交区间做核对(把 tag 名换成你们仓库真实标签):

# 上一版本标签至今的提交列表(示例)gitlog v1.2.0..HEAD--oneline# 只看符合约定式前缀的行(粗筛,按需调整正则)gitlog v1.2.0..HEAD--oneline|grep-E'^(feat|fix|docs|chore|refactor|test)'

若你们完全没用 tag,也可以先用日期或合并提交的起点,但长期建议打 annotated tag管版本。

gittag-av1.3.0-m"release v1.3.0"gitpush origin v1.3.0

六、可选进阶:什么时候再上自动化

当贡献者变多、发版变频繁,再考虑:

  • commitlint:在 CI 里拦截不规范提交信息(需团队共识,否则摩擦大)。
  • standard-version / release-it / changesets等:自动生成版本号与 CHANGELOG 草稿。

原则是:先把约定写进 CONTRIBUTING.md,再上加锁工具。否则新人第一条 PR 就被 lint 打回,体验很差。


七、给贡献者的一句话

看到仓库里有CONTRIBUTING.md写了 commit 规范,就照着写;没有的话,优先模仿现有历史里最多的那种前缀样式,别独自发明新方言。


总结

Conventional Commits 不是形式主义,而是把「以后要写 Release Notes」的成本前置到每次提交;CHANGELOG 是对用户的承诺摘要
两件事都做轻量一点,你的 Fork→PR 合并进去之后,维护者发版会轻松很多——反过来你也更容易拿到「合并」。

你们仓库现在是手写 CHANGELOG自动生成,还是「几乎没有」?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 9:47:26

基于Simulink的多速率系统建模与代码生成实战​

目录 手把手教你学Simulink——基于Simulink的多速率系统建模与代码生成实战​ 摘要​ 一、背景与挑战​ 1.1 为什么所有算法跑在一起,MCU就容易“过劳死”?​ 1.2 核心痛点与设计目标​ 二、系统架构与核心控制推导​ 2.1 整体架构:从“一锅炖”到“高铁调度”的魔法…

作者头像 李华
网站建设 2026/5/7 9:47:24

知识竞赛软件怎么选?

&#x1f6d2; 知识竞赛软件怎么选&#xff1f;6个核心指标帮你决策&#x1f4cc; 引言在组织知识竞赛时&#xff0c;一款合适的软件能极大提升活动效率与体验。然而&#xff0c;市场上选择众多&#xff0c;功能宣传令人眼花缭乱。本文系统梳理六个核心评估指标&#xff0c;助您…

作者头像 李华
网站建设 2026/5/7 9:46:23

ngx_http_init_connection

1 定义 ngx_http_init_connection 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_request.cvoid ngx_http_init_connection(ngx_connection_t *c) {ngx_uint_t i;ngx_event_t *rev;struct sockaddr_in *sin;ngx_http_port_t *…

作者头像 李华
网站建设 2026/5/7 9:45:34

企业知识库RAG到底有多难:实战1:原始文档处理

文章目录&#xff08;零&#xff09;项目位置&#xff08;一&#xff09;文档处理&#xff08;1.1&#xff09;原始文档&#xff08;1.2&#xff09;文档转换&#xff08;二&#xff09;格式&#xff08;2.1&#xff09;章节&#xff08;2.2&#xff09;标识与转义符号&#xf…

作者头像 李华
网站建设 2026/5/7 9:42:51

C#+YOLO工业视觉实战:5个项目沉淀的可复用架构设计

过去两年,我用C#+YOLO技术栈做了5个完整的工业视觉项目,从PCB板缺陷检测、手机中框尺寸测量,到瓶盖外观检测、药品包装喷码识别,再到物流分拣的条码读取。踩过的坑不计其数:从一开始所有代码挤在一个Form里,改个相机参数就要动半个项目;到后来推理速度上不去,生产环境跑…

作者头像 李华