用途 该技能的输出有两种:一条只读生成的符合规范的提交消息,或者一次范围正确的本地提交。它不执行 push。关键在于三件事:选对变更集、消息符合 emoji + Conventional Commits、报告与 Git 实际结果一致。
两种模式 message-only:用户只要生成、推荐或改写 commit message。此时只读 git status、git diff --cached、git diff 和必要文件,不 git add、不 git commit、不改 .gitignore 或其他工作树/index。默认分析 staged changes;用户点名另一组 unstaged/untracked 变更时只分析该范围,并说明 staged 内容被排除。范围不唯一时说明需要选哪组。 execute-commit:用户明确要求提交时才进入 stage、Ignore vs Commit 和 commit 流程。
确定提交范围(execute-commit) 首次探测合并为一次调用:git status --short --branch && git diff --cached --stat。随后按情况判断:有 staged 且用户未点名其他范围时只提交 staged,unstaged 不自动加入并提醒;有 staged 但用户授权的是另一组路径时停下报告范围错位,不提交、不 stage 新范围、不替用户 unstage;无 staged 且只有一个 unstaged/untracked 文件时,确认无敏感风险后 git add -- <path> 继续;无 staged 且有多个文件时,以用户点名范围或本会话刚完成、目的单一且可从 diff 核对的变更集为提交范围,无法归属的修改先排除,范围仍不唯一才询问;没有任何内容时告知用户。要求拆成多个提交时,每个提交各自用明确路径 stage 并逐个完成流程。
stage 边界 只用 git add -- <path...>。把 git status 全部条目批量喂给 git add(如 --pathspec-from-file)等同 git add -A,跳过逐项分类,除用户明确要求提交全部变更外不使用。路径名或 diff 像 .env、credential、token、cookie、private key、secret、证书或私密数据时,停下请用户确认。变更混有多个无关目的时,停下询问是否拆分。
Ignore vs Commit 候选里有 ?? untracked、依赖/构建/缓存/OS 噪音或疑似密钥时,先读 references/ignore-vs-commit.md 再分类;该忽略的补 .gitignore 且不 stage,已跟踪的密钥停下上报。候选全是已跟踪的源码/文档改动时无需读它。忽略不能静默:凡跳过 stage、改了 .gitignore、或因 ignore 规则未纳入的路径,当轮都要告诉用户路径/pattern、原因和做了什么。
写提交信息 用 git diff --cached 查看已确定范围的内容后写消息。用户给了消息就原样使用;仓库有自己的提交约定(commitlint 配置、CONTRIBUTING、AGENTS.md/CLAUDE.md 规定)时服从仓库;否则用 emoji type(scope): subject,emoji 由撰写者写入消息,不依赖 hook 自动补。type 与 emoji 对应:feat ✨ 新功能、fix 🐛 Bug 修复、docs 📝 仅文档、style 🎨 不改语义的格式调整、refactor ♻️ 非新功能非修复的代码调整、perf ⚡️ 性能、test ✅ 测试、build 🏗️ 构建系统或依赖、ci 👷 CI 配置和脚本、chore 🔧 其他杂项。header ≤ 250 字符;scope 可选,取模块、功能或目录名;subject 用祈使句、首字母小写、不加句号。body 可选,写“为什么”,每行 ≤ 300 字符。
提交与核对 提交前完成仓库要求的、与改动相关的验证;纯文档通常只查格式、链接或生成索引,代码或配置有影响时才加 lint、类型检查和测试。本会话对同一内容已通过的结果可复用,内容变了或仓库要求重跑就重跑。用 HEREDOC 提交并保留 hooks,例如:git commit -m "$(cat <<'EOF' ✨ feat(auth): add user login feature EOF )"。不用 --no-verify 或 HUSKY=0,除非用户明确要求。hook 失败时提交没有生成:修根因、重新 stage、再建新提交(不是 --amend);没成功就不报告成功。修复仅在机械时直接做(hook 输出已写明改法,或是格式化/lint autofix,且不改变代码行为和文字含义),并在报告中写明改了哪一行、为什么;需要判断时先报告 hook 输出和拟定改法,等用户确认。hook 可能改写文件,若改写了已提交路径,重跑受影响的聚焦验证。提交后核对:git status --short --branch && git log -1 --format='%h %s',报告以这次输出为准。
报告内容 给出提交 hash 和实际 subject、跑过的检查、仍未提交的文件,以及本次 Ignore vs Commit 处理过的路径(忽略了什么、为什么、是否改了 .gitignore)。