SKILL 04 / CODING · DEEP DIVE

Git 工作流三件套

Commit / PR / Changelog — diff 只答得了「改了什么」

2026-09-05 · BigCat

这是装机量最大的一类 skill,也是最容易被高估的一类:diff 里写着你改了什么,从来没写你为什么改。

前置 → Skill 03 代码审查类 Skills(审查完,接下来就是提交这一段)

// WHY THIS MATTERS

agent 帮你写完了代码、也审过了,接下来这一段谁都嫌烦:憋一句 commit message、写 PR 描述、发版前翻两百条提交凑 changelog。这一类工具替你干掉的就是这三件事。本期点名九个真实可装可读的条目,逐个给装法与「什么时候别装」;判据放后半程——因为这一类最要紧的判断只有一条:哪些活该交给 skill,哪些活其实该钉进一条 git 钩子里。

// 01

它替你干掉什么:九个能装的,先给表

论断:这九个分三段——提交前(写 message)、提交后(PR 那一摊)、发版时(changelog)。同段里挑一个,跨段可以叠。
条目(真名以仓库目录为准) 替你干掉的那件事 什么时候别装 ────────────────────────────────────────────────────────────────────────────────── git-commit-helper(davila7) 盯着 diff 憋 message 团队本来就没有提交规范 git-pushing(davila7) add / commit / push 三步手工 你需要挑着 stage gh-address-comments(davila7) PR 页和编辑器之间来回切 意见就一两条 gh-fix-ci(davila7) 点进 Actions 一层层翻日志 CI 红的原因你一眼看得出 github-pr-review(aidankinzett) review 没过目就发到 PR 上 你不在 GitHub 上审 finishing-a-development-branch(superpowers) 「写完了然后呢」的决策空转 只有一条主干、直接推 using-git-worktrees(superpowers) 为并行任务反复 stash 切分支 你从不并行 changelog-generator(Composio / davila7) 发版前翻两百条提交 已经在跑 release-please 内置 create a pr / --from-pr(官方) 手写 PR 描述、找不回当时那场 — ────────────────────────────────────────────────────────────────────────────────── 本期不报 star 数:GitHub 页面抓取到的数字这次几处明显失真,宁可不写

装法(都是原样能敲的)

# 1) 官方内置,零安装(据 Claude Code · Common workflows,2026-09)
create a pr                      # 文档里给的原话,直接说这一句
claude --from-pr 1234            # 回到当初开这个 PR 的那一场会话
claude --worktree feature-auth   # 另开一场并行,互不踩

# 2) superpowers(含 finishing-a-development-branch / using-git-worktrees)
/plugin install superpowers@claude-plugins-official

# 3) aidankinzett 那个 PR 审查件
/plugin marketplace add aidankinzett/claude-git-pr-skill

# 4) davila7 的 CLI,交互式挑组件(agent / command / hook / mcp / skill)
npx claude-code-templates@latest
# 最土也最通用的办法:把 SKILL.md 所在的文件夹整个拷进 ~/.claude/skills/

第一条立刻能跑的用法,一个字节都不用装——官方文档里就有这条管道:

git log --oneline -20 | claude -p "summarize these recent commits"

把后半句换成「按 feature / fix / breaking 分组,写成给用户看的发版说明」,你就已经有了一个 changelog 生成器。先跑这一条,再决定要不要装那个 skill。

失败模式:九个一起装。它们的 description 会互相抢触发——你说一句「push this」,可能跳出来的是 git-pushing,而你本来只想看看 diff。一段一个。
// 02

机制:diff 是唯一输入,这决定了它的天花板

论断:这一类 skill 全都只吃一样东西——git diff --staged。diff 是一份完备的「what」,同时是一份彻底空白的「why」。这条不对称解释了它所有的好用和所有的翻车。

diff 能做对的部分

git-commit-helper(SKILL.md)的做法很典型:读 git diff --staged 与 git status,产出 <type>(<scope>): <description>,type 限定在 feat / fix / docs / style / refactor / test / chore,摘要 50 字符内、祈使句、句尾不加标点,并提示用 git add -p 把混在一起的改动拆开。这几件事 diff 里全有答案:类型看改了什么文件,scope 看目录,该不该拆看改动有几簇。所以这一段它做得比人稳——人会偷懒写「update」。

diff 里没有的那一半

同一份 SKILL.md 又要求「body 解释 reasoning,不只是动作」。而 reasoning 不在 diff 里。模型只能从代码反推动机,反推出来的通常是把 what 换个说法再讲一遍——这就是这类 skill 唯一真实的失败模式。

可操作的推论:commit 类 skill 的正确时机是刚做完的那一刻,在还留着那场对话的会话里让它写。why 此刻在上下文里;隔天再补,它就只剩 diff 了。「攒一周再统一补提交信息」是这类工具最没用的用法。

链条越往下游,信息丢得越多

changelog 类的输入不是 diff,是 commit message。changelog-generator(Composio 与 davila7 都收了同一份)做六件事:按时间段或 tag 区间扫历史、分类、把开发者用词改写成用户用词、排版、过滤掉重构和测试这类内部提交、再套品牌口径。它的上限被你的提交质量死死卡住。

diff ──→ commit message ──→ changelog ↑ ↑ ↑ what 完备 why 靠人补 只剩 message 里剩下的 每往右一步都在丢信息,且丢掉的补不回来

这就是 Conventional Commits 真正值钱的地方:feat: / fix: / BREAKING CHANGE 不是格式洁癖,是你在提交那一刻留给下游机器的结构化元数据。留了,changelog 和版本号就能算出来;没留,下游只能靠模型猜。

// 03

真实用法与边界:约定用样例编码,危险动作用脚本钉死

论断:这一类 skill 好不好用,只看两件事——你们团队的口径有没有编进去,以及不可逆的那一步有没有交回给人。

把团队约定编进去:贴样例,别写条款

默认的 conventional commits 谁都能背,但你们仓库真正的口径是背不出来的:scope 该写包名还是模块名、多大的改动才算 feat、要不要挂 issue 号。最省事的做法是打开你们最近二十条大家都认可的提交,挑三到五条整段贴进 SKILL.md 当样例——三对真实的「diff 长这样 → message 这么写」比十条规则管用得多(这条配方 Skill 18 会单独拆)。放哪:团队共享就放进仓库的 .claude/skills/ 跟着代码走,个人偏好放 ~/.claude/skills/。

PR 那一摊:好 skill 都明写自己不管什么

不可逆的一步,交回给人

superpowers 的 finishing-a-development-branch(SKILL.md)是这一类里最该抄的一个。它先跑全量测试,测试没过就停,连菜单都不给你看;然后判断是普通仓库还是 worktree、确认基线分支(拿不准就问「这条分支是从 X 分出来的吧?」),最后给出恰好三条的菜单:本地合回去 / 推上去开 PR / 就这么放着我自己来——然后等人选。SKILL.md 把理由写死了:集成决策属于人。删除更狠,要你手打「discard」这个词才执行。

另一条路是把动作钉进脚本。git-pushing(SKILL.md)要求一律走它自带的 scripts/smart_commit.sh,原话是「ALWAYS use the script — do NOT use manual git commands」。确定性的步骤写进脚本,模型只负责填那句 message,这是所有涉及 push 的 skill 都该照抄的结构。

失败模式:让 agent 一路 commit → push → 开 PR 不停顿。push 是不可逆面,一旦推到共享分支,回滚的成本就不是你一个人的了。
// 04

代价与替代品:什么时候一条 hook 比 skill 更合适

论断:有确定答案的交给钩子,需要判断的才交给 skill。git 工作流里能被确定性工具接管的比例,比这一类 skill 的宣传口径高得多。

为什么钩子更可靠:skill 是建议,钩子是拒绝

skill 注入的是指令,模型可以不听、可以没被触发、可以这次听下次不听。钩子是代码,它在事件上无条件执行。Claude Code 的 hooks 文档把这层关系说得很清楚:「钩子可以拒绝这次调用,但它保持沉默并不等于批准。」—— PreToolUse 上挂一条模式匹配拦住 git push --force,比在 SKILL.md 里写十遍「不要强推」牢靠得多。

三件事,该让确定性工具做

  1. 格式合规 → commitlint(MIT)。npm install --save-dev @commitlint/cli,再按官方 local-setup 指南挂进 husky 的 commit-msg 钩子。替你干掉:靠 review 抓格式。什么时候别装:团队还没定下规范,先定规范再上工具。
  2. changelog 与版本号 → git-cliff(Apache-2.0 / MIT 双授权,cargo install git-cliff,也有 npm / PyPI / Docker 分发)或 release-please(Apache-2.0,官方推荐用 release-please-action)。后者维护一个随提交持续更新的 release PR,你合并它就自动打 tag、发 release。什么时候别装:你的提交历史根本不守 conventional commits——这两个都从提交里解析,垃圾进垃圾出。
  3. 提交前的固定检查 → 一条 pre-commit 钩子。davila7 的 CLI 直接给了现成的:npx claude-code-templates@latest --hook git/pre-commit-validation --yes。

那 skill 还剩什么

剩下的恰好是钩子做不了的:commit body 里那句 why、把一坨混着的改动拆成几个提交、PR 描述里「reviewer 该测哪几条路径」。这三件都需要判断,也都没有客观判定器。这才是这一类 skill 真正的地盘,其余的都该往下沉。

三笔账

// 一页选购卡

先装这三个:① 什么都别装,先敲 git log --oneline -20 | claude -p "按 feature/fix/breaking 分组写发版说明"——官方管道,今天就能试;② commitlint + husky 的 commit-msg 钩子,把格式这件有确定答案的事钉死,它是钩子不是 skill,正因如此才可靠;③ superpowers 的 finishing-a-development-branch(/plugin install superpowers@claude-plugins-official),它治的是「写完了然后呢」的空转,而且不可逆的那一步会交回给你。

再加一个(挑一个,别都装):想要固定口径的提交信息 → git-commit-helper,装完立刻贴三条你们自己的样例进去;在 GitHub 上审 PR → github-pr-review;CI 老红 → gh-fix-ci;要正式发版 changelog → 用 release-please 或 git-cliff,而不是任何 skill。

什么时候别装:单人仓库直接 git commit -m · 已经在跑 release-please / changesets · 你的团队根本不读提交信息(那先解决这个)。

装完两周复查:它写的 commit message 你原样采用了几成?低于五成,去补样例,不是换工具。

// 术语表

Conventional Commits(约定式提交)
<type>(<scope>): <description> 的提交格式规范。它的意义不是整齐,是给下游机器留结构化元数据——版本号和 changelog 都靠它算。
commit-msg 钩子
git 在写完提交信息、正式落库之前触发的本地钩子。校验不通过就拒绝这次提交,是格式规范唯一真正管用的落点。
release PR(发版 PR)
release-please 的核心机制:它长期维护一个 PR,随新提交不断更新版本号与 CHANGELOG;你合并它,就等于发版。
worktree(工作树)
同一个仓库的另一份独立签出,各自在自己的分支上。用它并行开几场会话,改动互不覆盖,不用反复 stash。
pending review(暂存评审)
GitHub 的机制:多条评论先攒成草稿,最后一次性提交。github-pr-review 用它做「发出去之前先给人过目」的闸门。
what 与 why
diff 完整回答「改了什么」,完全不含「为什么改」。这一类 skill 所有的可靠与不可靠,都从这条不对称推出来。

// 延伸阅读