cm · diff
git:20260606.a0b7686 to git:20260727.5a67c7d
27 added, 4 removed. Audit A to A.
---
name: cm
description: 分批分类按规范提交
disable-model-invocation: true
argument-hint: "[可选:限定文件或范围]"
---
- 把当前改动分批分类提交:
+ 把当前改动分批分类提交。
- - 优先按上下文里已有的任务列表分组:这次会话如果已经按任务分了批,就照任务边界切 commit。但任务边界不等于 commit 边界——一个 commit 仍然只做一件事,任务里夹带的无关改动要拆出去,diff 里任务列表之外的零散改动也要捡进来,以实际 `git diff` 为准,任务列表只是分组线索。
- - 没有任务列表时,先 `git status` + `git diff` 看清全部改动,按逻辑主题分组:一个 commit 只做一件事,无关改动不混在一起;改动跨多个不相关主题就拆成多个 commit。
+ 先看清全部改动:`git status --porcelain`(含未跟踪文件,`git diff` 看不到它们)+ `git diff`。顺手扫一眼有没有密钥、调试输出、误加的文件。
+
+ ## 分组
+
+ - 合在一起是默认,拆需要给出理由。理由只有一种算数:这两部分放同一个 commit 里会让人看不清改了什么,或者将来想回退其中一半会连累另一半。说不出这个理由就不拆。
+ - 以下都不算理由:文件不同、目录不同、语言不同、改动类型不同(顺手改的一行文档不需要单独一个 docs commit)、改动行数多、跨了前后端。
+ - 每个 commit 必须能独立成立——单独看是完整的一件事,不是半截。一件事的所有必要部分放同一个 commit:改函数签名和它的调用点、新增配置项和读它的代码、改动和它对应的测试,不许分开提交攒数量。
+ - 先看 `git log` 里这个项目历史 commit 的粒度,按同样的粒度分,不套模板。
+ - 上下文里已有的任务列表只是线索,不是分组依据:任务里夹带的无关改动要拆出去,任务列表之外的零散改动要捡进来,以实际 `git diff` 为准。
+ - 一个文件里混了两件事,整个文件放进主要那边,在 message 里说明。不做文件内拆分。
+ - 分组必须是文件清单的一个划分:每个文件属于且只属于一个组,不重不漏。
+
+ ## 提交操作
+
+ - `git add <路径…>` 逐组提交,全程不动工作区。禁 `git add -A`、`git commit -a`。
+ - 禁止用 `git stash` / `git reset` / `git checkout` 来回倒腾着切割改动——这条路会走到 `git reset --hard` 丢数据(claude-code issue #14293),主流 commit skill 里也没人这么做。
- 个人项目默认直接提交到当前分支;只有改动大或有风险、主分支受保护、或多人协作时,才先开分支。
- - 每条 commit message 按我全局 `~/.claude/CLAUDE.md` 里的 commit 规范写——那里有完整格式要求,照它执行,这里不重复。
+
+ ## Message
+
+ - 格式和禁忌照我全局 `~/.claude/CLAUDE.md` 里的 commit 规范执行,这里不重复。
+ - 每句话都必须提供 diff 里看不出来的信息。看 diff 就知道的事一律不写。
+ - 没有值得写的 why 就不写 body,单行 subject 完事,不要为了「像样」硬凑段落。
+
+ ## 收尾
+
- 提交前把分组方案 + 每条 message 列给我看一眼。
+ - 全部提交完跑一次 `git status` 核对,剩余改动必须是事先说好不提交的那些。
- 未经我明确同意不要 push。
带参数时只提交指定的那部分,其余不动。