关于 conventional-git
用于规范分支名、提交信息和本地 Git worktree 的 Conventional Commits 指南,帮助贡献者保持变更历史与问题追踪的一致性。
主要功能
- 01Conventional 分支命名
- 02提交格式与类型指南
- 03通过页脚关闭问题
- 04本地 worktree 命名与清理
- 05Squash merge 标题规范
适用场景
- 01为带问题编号的功能命名分支
- 02编写标记破坏性变更的提交
- 03通过提交页脚关闭跟踪的问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ samber/ cc-skills --skill conventional-git安装后在 Claude Code 中输入/conventional-git确认已加载。
附带文件evals/evals.json
详细介绍
Conventional Commits 与分支命名
分支名称和提交消息均遵循 Conventional Commits v1.0.0——统一的命名方式可让工具自动生成变更日志、强制执行 SemVer 版本递增,并按关注点筛选历史记录。
分支命名
格式:<type>/[issue-]<description>——使用小写字母,只能用连字符,不得包含 / 以外的特殊字符。
feat/user-authentication
feat/42-user-authentication
fix/login-race-condition
fix/87-login-race-condition
docs/api-reference-update
refactor/payment-module
如果有 issue 编号,请将其作为前缀——GitHub 和 GitLab 会自动创建链接,也便于通过 git log 立即追溯到跟踪器。描述保持在 50 个字符以内——大多数 git UI 会在列表中截断超出此长度的分支名称。根据所做的工作选择对应类型——读者会依据这一约定快速了解分支用途。
分支名称中绝对不要包含 worktree——git worktree 是本地检出机制,而不是分支概念;使用该名称会将实现细节暴露到远程端,并让其他贡献者困惑。
Worktree 命名
Worktree 是本地检出目录——不会出现在远程端。将其放在 .claude/worktrees/ 下,并将分支名称中的 / 分隔符替换为 - 来命名。
git worktree add .claude/worktrees/feat-user-authentication feat/user-authentication
git worktree add .claude/worktrees/fix-87-login-race-condition fix/87-login-race-condition
目录名称与分支名称保持一致,这样 git worktree list 的输出更易读,也无需检查检出内容,就能立即追溯每个 worktree 对应的分支。创建新 worktree 前先运行 git worktree list——如果已有 worktree 对应同一分支,就重复使用。
每个 worktree 只用于一个分支。在其他人的 worktree 中处理无关工作,会让变更归属变得模糊,也更容易在清理时出错。
分支合并后移除 worktree——无论是在本地合并后,还是在远程端的拉取请求/合并请求关闭后。过时的 worktree 会不断累积,让 git worktree list 难以阅读。
git worktree remove .claude/worktrees/feat-user-authentication # branch merged locally
git worktree prune # remove refs to already-deleted directories
提交消息格式
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
类型:
| Type | SemVer | 适用场景 |
|---|---|---|
feat | MINOR | 新功能 |
fix | PATCH | 修复错误 |
docs | — | 仅文档 |
style | — | 格式调整,不改变逻辑 |
refactor | — | 重构,不涉及新功能或修复 |
perf | — | 性能改进 |
test | — | 添加或修复测试 |
build | — | 构建系统、依赖项 |
ci | — | CI 配置 |
chore | — | 其他事项(非 src/test) |
revert | — | 撤销之前的提交 |
规则:
- 主题行不超过 72 个字符——git log 和 GitHub/GitLab UI 会静默截断更长的主题行
- 使用祈使语气:“add”而不是“added”——读起来像指令,而不是历史记录
- 不使用大写字母,末尾不加句号——确保变更日志工具能够统一解析
- 正文与主题之间空一行——解析器会在第一个空行处分割标题和正文
- 破坏性变更:在类型/范围后使用
!,或添加BREAKING CHANGE:页脚(触发 MAJOR 版本递增)——仅在正文中描述,变更日志工具无法识别 revert提交 SHOULD 在正文中包含This reverts commit <hash>.——git revert会自动生成此内容;不要删除- 绝对不要在提交中添加 Claude 签名、AI Agent 署名,或 Claude 或任何其他 AI Agent 的
Co-authored-by尾注
示例:
feat(auth): add JWT token refresh
fix: prevent race condition on concurrent requests
Introduce request ID and reference to latest request.
Dismiss responses from stale requests.
refactor!: drop support for Go 1.18
BREAKING CHANGE: Go 1.18 no longer supported; uses stdlib APIs from 1.21+
通过提交消息关闭议题
GitHub 和 GitLab 都会检测提交消息中的关键词,并在提交合并到默认分支时自动关闭所引用的议题。请将引用放在页脚中(推荐,这样可以保持主题行简洁)。
关键词: close、closes、closed、fix、fixes、fixed、resolve、resolves、resolved——不区分大小写。
GitHub:
fix(auth): prevent token expiry race condition
Closes #42
Closes owner/repo#99
- 合并到默认分支时触发(通常是
main) - 跨仓库:
Closes owner/repo#42 - 关闭多个议题:
Closes #42, closes #43 - 也适用于 PR 描述
GitLab:
feat: add dark mode support
Resolves #101
Closes group/project#42
- 合并到默认分支时触发(可在每个项目中配置)
- 跨项目:
Closes group/project#42 - 关闭多个议题:
Closes #101, closes #102 - 也适用于 MR 描述
提示: 将提交类型与关闭议题的操作对应起来——例如用 fix: 关闭错误议题,用 feat: 关闭功能请求——可使变更日志在语义上保持连贯。
常见错误
| 错误 | 修正 |
|---|---|
feat: Added login page | feat: add login page——使用祈使语气,不要大写 |
fix: fix bug. | fix: fix bug——末尾不要加句号 |
| 主题超过 72 个字符 | 缩短主题;将详细信息移至正文 |
| 只在正文中说明不兼容变更 | 添加 ! 或 BREAKING CHANGE: 页脚——工具无法检测仅写在正文中的内容 |
feat(adding-auth): ... | feat(auth): ...——范围应为名词,而不是动词 |
在主题行中写 Closes #42 | 移至页脚——保持主题简洁且易于解析 |
最佳实践
- 让分支类型与提交类型保持一致——
feat/auth-*分支对应feat(auth):提交 - 每个分支只处理一个关注点——在功能分支中混入修复会使变更日志含义不清
- 在分支内统一使用范围——始终使用
feat(auth):,不要中途改为feat(user): - 压缩合并: 压缩合并 PR/MR 时,分支提交会合并为一个提交,PR/MR 标题会成为提交消息。如果标题不符合 Conventional Commits 格式,变更日志生成会悄无声息地出错。压缩合并前务必设置 PR 标题。