Skip to content

附录 D:提交信息规范详解

规范的提交信息是高质量项目的重要组成部分。本附录详细介绍 Conventional Commits 规范及其实际应用。

Conventional Commits 规范

Conventional Commits 是一套基于语义化版本的提交信息规范。

格式

<type>[optional scope]: <description>

[optional body]

[optional footer(s)]

Type 类型一览

Type说明触发版本升级
feat新功能minor
fixBug 修复patch
docs文档变更不升级
style代码格式(不影响功能)不升级
refactor重构(既非新功能也非 Bug 修复)不升级
perf性能优化patch
test添加或修改测试不升级
build构建系统或外部依赖变更不升级
ciCI 配置文件和脚本变更不升级
chore其他维护工作(不修改 src 或 test 文件)不升级
revert回退某次提交视情况

破坏性变更(Breaking Change)

触发 major 版本升级:

# 在 type 后加 !
feat!: 重构用户认证 API

# 或者在 footer 中说明
feat(auth): 重构用户认证 API

BREAKING CHANGE: AuthService 接口已更改,调用方需更新方法签名

完整示例

简单提交(只有 subject)

feat: 添加用户注册功能
fix: 修复登录时的空指针异常
docs: 更新 README 中的安装说明
chore: 升级依赖到最新版本
test: 添加用户服务的单元测试
refactor: 提取公共工具函数到 utils.js

带 scope 的提交

feat(auth): 实现 JWT Token 刷新机制
fix(cart): 修复购物车数量计算错误
docs(api): 补充 /users 端点的参数说明
style(button): 统一按钮组件的 padding 值

带 body 的提交

feat(payment): 集成支付宝支付

支持用户通过支付宝完成订单支付。
实现了回调验签和订单状态更新逻辑。

相关文档:docs/payment/alipay.md
fix(auth): 修复 Token 过期后未能正确跳转登录页

问题原因:axios 拦截器中未正确处理 401 状态码,
导致 Token 过期后用户仍停留在当前页面。

Closes #234
Reviewed-by: Alice <alice@example.com>

破坏性变更

feat(api)!: 将 /api/v1 升级为 /api/v2

新版本 API 重新设计了响应格式,统一使用 { code, data, message } 结构。

BREAKING CHANGE: 所有 API 响应格式已更改,客户端需要更新解析逻辑。
旧格式:{ status: 'ok', result: {} }
新格式:{ code: 0, data: {}, message: 'success' }

Migration guide: https://docs.example.com/migration/v2

Subject 写作规范

好的 subject:

✅ feat: 添加用户头像上传功能
✅ fix: 修复移动端导航栏遮挡内容的问题
✅ refactor: 将 UserService 拆分为多个职责单一的服务

不好的 subject:

❌ 修改了一些东西          # 太模糊
❌ fix bug                 # 没有说明是什么 bug
❌ WIP                     # 未完成的工作不应提交
❌ feat: 添加了用户头像上传功能并修复了相关的上传失败的bug以及优化了上传速度  # 太长

规则:

  • 动词开头,使用祈使语气("添加"而不是"添加了")
  • 不超过 72 个字符
  • 不以句号结尾
  • 英文首字母小写(如果使用英文)

引用 Issue 和 PR

# GitHub 风格
Closes #123
Fixes #123
Resolves #123

# 关闭多个
Closes #123, #456

# 只引用不关闭
Related to #123
See also #456

# GitLab 风格
Closes gitlab#123

工具配置

commitlint(强制规范)

bash
# 安装
npm install --save-dev @commitlint/cli @commitlint/config-conventional

# 配置文件 commitlint.config.js
module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [
      2, 'always',
      ['feat', 'fix', 'docs', 'style', 'refactor', 'perf', 'test', 'build', 'ci', 'chore', 'revert']
    ],
    'subject-max-length': [2, 'always', 100],
    'subject-case': [0],  // 不限制大小写(中文友好)
  },
};

Husky + commitlint(在提交时自动验证)

bash
# 安装
npm install --save-dev husky

# 初始化 Husky
npx husky init

# 添加 commit-msg 钩子
echo 'npx --no -- commitlint --edit "$1"' > .husky/commit-msg

Commitizen(交互式填写提交信息)

bash
# 全局安装
npm install -g commitizen cz-conventional-changelog

# 全局配置(~/.czrc)
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc

# 之后使用 git cz 代替 git commit
git cz

conventional-changelog(自动生成 CHANGELOG)

bash
# 安装
npm install -g conventional-changelog-cli

# 生成 CHANGELOG(追加模式)
conventional-changelog -p angular -i CHANGELOG.md -s

# 从头生成完整 CHANGELOG
conventional-changelog -p angular -i CHANGELOG.md -s -r 0

团队落地建议

快速起步(推荐)

bash
# 1. 安装工具
npm install --save-dev @commitlint/cli @commitlint/config-conventional husky

# 2. 初始化 Husky
npx husky init

# 3. 配置 commitlint
cat > commitlint.config.js << 'EOF'
module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'subject-case': [0],
  },
};
EOF

# 4. 配置钩子
echo 'npx --no -- commitlint --edit "$1"' > .husky/commit-msg

# 5. 提交配置
git add commitlint.config.js .husky/commit-msg
git commit -m "chore: 添加 commitlint 提交规范"

CHANGELOG 规范的 Emoji 增强版

有些团队喜欢在提交中加入 emoji,增加可读性:

✨ feat: 添加用户注册功能
🐛 fix: 修复登录问题  
📚 docs: 更新文档
🎨 style: 代码格式化
♻️ refactor: 重构认证模块
⚡ perf: 优化查询速度
✅ test: 添加单元测试
🔧 chore: 更新配置

可以使用 gitmoji 工具:

bash
# 安装
npm install -g gitmoji-cli

# 使用(替代 git commit)
gitmoji -c

常见 FAQ

Q: 一次提交可以同时有 feat 和 fix 吗?

A: 不建议。一次提交应该只做一件事。如果有多个变更,分多次提交。

Q: 重构代码时发现了 bug 顺手修了,怎么写?

A: 分两次提交:

  1. refactor(xxx): ...
  2. fix(xxx): ...

Q: 提交了错误的类型,能改吗?

A: 如果还没推送:git commit --amend 如果已推送且是公共分支:创建一个新的修正提交或接受错误(不要改历史)

Q: 中文还是英文?

A: 根据团队情况。中文团队用中文更清晰;开源项目建议用英文。关键是全团队保持一致。