暂存。点击。推送。Magic Push 读取实际的 diff,生成一条描述修改内容与原因的提交消息,然后推送——不再有"wip"占位符,不再有"fix stuff"记录。
大多数工程师都知道一条好的提交消息应该是什么样的,但大多数工程师的提交日志里却充斥着糟糕的记录。问题不在于好消息难写——其实并不难。问题在于,当你准备好提交时,活已经干完了,人也累了,diff 还很复杂,再用精炼的祈使句把这一切总结出来,是你最不想做的一件事。于是你敲下"fix"、"updates",最糟糕的是"wip",然后继续。三周后,某个地方出了问题,你试着用 git blame 定位回归点,却发现那条提交消息什么都没说。
这个问题是不对称的:写提交消息只需三十秒,而读一条烂消息,每次都要多花好几分钟。然而成本由未来的你承担,时间却是现在的你节省的,所以这种惰性会不断累积,最终让日志越来越差。唯一可持续的解法是消除写时的摩擦。如果写一条好消息的时间成本为零,你自然就会写好。
Magic Push 弥合了这道鸿沟。它让 AI 读取已暂存的 diff——改了哪些文件、哪些行、改动的形状——然后起草一条描述这些变化的提交消息。你审阅草稿,有偏差就修改,然后推送。全程耗时大约等于读三行文字的时间。"好好写条消息"的心理门槛,从"需要思考三十秒"降低到"读五秒钟"。
在侧边栏打开 git 面板。你会看到两个区域——"未暂存"列出当前的编辑内容,"已暂存"列出准备提交的内容。点击即可在两个区域之间移动文件,也可以展开文件后按 hunk 单独暂存。
粒度很重要:Magic Push 描述的是已暂存的内容,而不是所有修改。如果你改了五件事但只想提交其中一件,只暂存那一件即可。生成的消息将围绕那一件,而不是整个 diff。
在 git 面板的提交消息输入框上方,有一个按钮(通常是闪烁星形图标,有时标注"建议")。点击它,AI 会读取已暂存的 diff,然后在输入框中生成一条草稿消息,通常是一行祈使句式的摘要,对于非琐碎的改动还会附带一段正文。
举例来说:给某个 HTTP handler 添加限速日志的 diff,可能会生成:"Add rate-limit logging to /api/upload"。将三个文件重构为使用共享 helper 的 diff,可能会生成:"Extract shared signing logic into AuthHelper"。如果 diff 混合了两处不相关的改动,可能会生成:"Add rate-limit logging and rename UserRepo to UserStore"。最后这条是一个信号:当 AI 难以用一句话概括时,这个提交很可能是"两个提交穿着一件外套"。
AI 生成的草稿善于描述改了什么,因为它能看到 diff。但对于改动的原因,它就力不从心了——原因不在 diff 里,而在你脑子里、工单里,或者上周的讨论中。当原因很重要时(大多数非琐碎的提交都如此),请在草稿基础上补充原因。
示例:"Rename UserRepo to UserStore"是 diff 呈现的内容,但原因可能是"Match the StoreRepo / FooStore naming convention adopted in #1422"。AI 不知道 #1422,除非你告诉它。请把它加进去。
对于琐碎的提交(lint 修复、格式调整、拼写改正),草稿通常无需修改。
消息就绪后,点击推送按钮。git 面板会使用你的消息完成提交,然后推送到跟踪的远程分支。整个流程——暂存、生成、编辑、推送——对于典型的改动通常不超过一分钟。
如果你只想提交而不推送(还没准备好分享),有一个独立的"仅提交"选项。等你准备好了再推送。
不同团队有不同的提交消息规范:Conventional Commits(feat: ...、fix: ...、chore: ...)、不带前缀的祈使句、只写简短摘要不带正文、在末尾引用工单 ID 等。
只需在项目根目录的 CLAUDE.md 中告诉 AI 你团队的规范一次:
## Commit messages
Use imperative voice, no conventional-commit prefix. End with the
ticket ID if applicable, e.g. "Add rate-limit logging (#1422)".
之后生成的草稿都会遵循该规范。整个仓库都能受益——任何在这个项目中使用 LingCode 的人都将获得相同的风格。
main"的规定,不要让 AI 帮你推。Magic Push 只会推送到你当前所在的分支。如果团队使用基于 PR 的工作流,请推送到功能分支后再开 PR。(你也可以通过 PreToolUse hook 来强制执行——"拒绝任何目标为 main 的 git push"。)