省流:这套规范叫 Conventional Commits常用格式:type(scope): descriptionfeat 新功能fix 修 bugscope 可选:feat: add loginfeat(auth): add login不要写:feat(): add login破坏性变更:feat(api)!: change user endpoint好家伙,今天整理 Git 提交信息规范。这套写法来自 Conventional Commits 1.0.0 官方规范,不是 Git 强制语法,而是一套社区约定。它的价值很简单:让人一眼看懂这次提交做了什么。也让工具能根据提交信息生成 changelog 或判断版本号。Conventional Commits 官方规范也说明,它很大程度上受 Angular Commit Guidelines 启发。0.为什么提交信息也要有规范先说一个很现实的问题。如果一个项目的提交记录长这样:updatefix修改再改一下临时提交bug fix过两周再回头看,基本等于没写。你只能一个个点开 diff 猜:这次到底改了什么?是加功能?是修 bug?是改文档?还是只是格式化?提交信息规范要解决的就是这个问题。它不是为了装专业。它是为了让提交记录能被人看懂,也能被工具识别。比如:featfixdocsrefactortestchore这些词放在提交信息最前面,相当于给每次提交打了一个类型标签。以后看日志时,就能快速知道:哪些提交是新功能哪些提交是修 bug哪些提交只是文档或测试哪些提交可能影响版本号1.先看基本格式Conventional Commits 的基本格式可以先记成这样:():更完整一点是:[optional scope][!]:[optional body][optional footer(s)]先别被完整格式吓到。日常最常用的就是第一行。比如:feat(blog): add draft import commandfix(publish): avoid duplicate image uploaddocs(readme): add setup guide可以看这张图:Conventional Commits结构里面最关键的是四块:type: 这次改动是什么类型scope: 这次影响哪个模块,可选!: 是否是破坏性变更,可选description: 一句话说明做了什么所以不要把它理解成复杂语法。它本质上就是:用固定格式说清楚这次提交的性质。2.feat是什么feat 表示:新增功能。比如你给项目加了一个之前没有的能力:feat(auth): add password loginfeat(blog): support markdown importfeat(api): add user profile endpoint这些都属于 feat。我现在的判断方法是:用户或调用方能感知到一个新能力,大概率就是 feat。比如在这个博客项目里:支持导入 Markdown 文件支持上传图片到博客园支持生成发布预览这些都算功能。所以可以写:feat(draft): import markdown filefeat(publish): upload local imagesfeat(preview): generate cnblogs publish preview3.fix是什么fix 表示:修复 bug。比如之前功能已经存在,但是有问题:fix(publish): handle png upload failurefix(parser): keep code block indentationfix(cli): show readable error on missing token我现在的判断方法是:原来应该能正常工作,但实际不正常,这次把它修好了,就是 fix。比如:图片路径没有被替换成远程地址发布时重复上传同一张图片Markdown 表格渲染错位命令报错信息不清楚这些都更适合写 fix。4.scope是什么scope 就是括号里的部分。比如:feat(auth): add password loginfix(publish): retry image uploaddocs(readme): add install steps这里的:authpublishreadme就是 scope。它表示这次提交主要影响哪个范围。scope 不是必须的。如果不用 scope,就直接写:feat: add markdown importfix: avoid empty title注意这里有一个容易写错的地方:feat(): add markdown import这种写法不推荐。因为 scope 是可选的。如果没有 scope,就把括号整个省掉:feat: add markdown import如果有 scope,再写括号:feat(draft): add markdown import也就是说:有范围 - feat(scope): xxx没范围 - feat: xxx不要写空括号。5.除了feat和fix,还有哪些常见type一开始不用背太多。先把这些常见的用准就行:常见提交type我现在会这样记:| type | 什么时候用 | | — | — | | feat | 新增功能 | | fix | 修复 bug | | docs | 只改文档 | | style | 只改格式,不影响逻辑 | | refactor | 重构代码,行为不变 | | test | 新增或修改测试 | | chore | 杂项维护 | | perf | 性能优化 | | build | 构建系统相关 | | ci | CI/CD 流水线相关 |