1. 为什么我决定把 Git 提交交给 Claude Code Skill
每天写代码最烦的不是写逻辑,而是收尾那三行命令。git add .、git commit -m "..."、git push,敲了几百遍还是会烦,尤其是 commit message 那一步——改了三五个文件,脑子里全是业务逻辑,还要硬憋一句“feat: 优化用户查询接口”。憋不出来就写个“update”,过两天回头看提交记录,自己都不知道当时改了啥。
这个痛点其实特别适合用 Claude Code 的自定义 Skill 来解决。Skill 是什么?简单说就是你把一段固定的操作流程写成 Markdown 文件,Claude Code 读到之后就知道“当用户输入某个指令时,我该按什么步骤干活”。它不是一个插件,不需要编译,不需要装依赖,就是一个放在特定目录下的SKILL.md文件。适合谁?适合每天都在用 Claude Code 写代码、又不想在 Git 操作上浪费脑力的开发者。你只需要敲一个/gitpush,剩下的暂存、生成提交信息、提交、推送全部自动完成。
我试过之后发现,真正有价值的不是省了那几秒钟敲命令的时间,而是 commit message 的质量上来了。Skill 会先跑git diff --cached --stat看看到底改了哪些文件,然后根据文件名和变更类型生成feat:、fix:、docs:这类规范前缀的描述。比我自己随手写的“update”强太多。
这篇文章我会从零拆解怎么写这个 Skill:触发条件怎么设、参数怎么设计、提交流程怎么编排、源码长什么样、怎么在本地验证、遇到冲突怎么排查。你跟着做,十分钟就能拥有自己的/gitpush。
2. 任务型 Skill 的核心机制与存放位置
在动手写之前,得先搞清楚任务型 Skill 和参考型 Skill 的区别。参考型 Skill 更像是一份知识文档,Claude Code 在需要的时候自动读取里面的内容来辅助回答。任务型 Skill 不一样,它是“用户主动触发、按步骤执行”的。核心区别就在一个配置项:disable-model-invocation: true。
这个配置项的意思是禁用模型自动调用。如果不加这一行,Claude Code 有可能在你不经意的时候自动触发这个 Skill,比如你只是随口提了一句“帮我提交一下”,它就自己跑起来了。加上之后,它只能通过你手动输入/gitpush来触发。对于 Git 提交这种有副作用的操作,必须手动触发才安全。
Skill 的存放位置分两种:项目级和用户级。项目级放在项目根目录的.claude/skills/下面,只对当前项目生效。用户级放在用户主目录的.claude/skills/下面,对所有项目生效。Git 提交这个 Skill 显然是通用的,所以放用户级更合适。
以 Windows 为例,路径是这样的:
C:\Users\Administrator\.claude\skills\gitpush\SKILL.md注意最后一层文件夹名gitpush就是 Skill 的名字,Claude Code 靠这个目录名来识别。Linux 和 macOS 对应的是~/.claude/skills/gitpush/SKILL.md。目录建好之后,里面只需要一个SKILL.md文件,不需要其他任何东西。
任务型 Skill 的编写有三个必须项。第一是执行步骤,你得明确告诉 Claude Code 第一步干什么、第二步干什么,不能含糊。第二是输出格式,成功时输出什么、失败时输出什么,最好给出模板。第三是注意事项,这一步不是强制的,但写好了能避免很多意外,比如“始终使用git add -A”这种约束。
理解了这些,就可以开始写源码了。
3. 完整 SKILL.md 源码与配置拆解
下面是我实际在用的SKILL.md完整内容,你可以直接复制到自己的~/.claude/skills/gitpush/SKILL.md里。我逐段拆解一下关键设计。
--- name: gitpush description: 自动用 git 提交代码并推送到远程仓库。当用户输入 `/gitpush` 时触发此技能。功能包括:自动暂存所有更改、自动生成提交信息、自动提交到本地仓库、自动推送到远程分支。成功后报告提交状态、文件数量和耗时。 disable-model-invocation: true --- # GitPush 技能 自动完成 git 提交流程:暂存 → 生成提交信息 → 提交 → 推送到远程仓库。 ## 执行步骤 ### 1. 检查 git 状态 使用 `git status` 检查当前仓库状态,确认是否有可提交的内容。 ### 2. 暂存更改 如果有待提交的文件,执行 `git add -A` 暂存所有更改。 ### 3. 生成提交信息 执行 `git diff --cached --stat` 获取暂存的变更统计,然后: - 如果有新增文件,提取新增文件的文件名 - 如果有修改文件,提取修改的文件名 - 根据变更内容生成简洁的提交信息,格式:`feat: 描述` / `fix: 描述` / `docs: 描述` / `chore: 描述` ### 4. 执行提交 使用生成的提交信息执行 `git commit -m "提交信息"` ### 5. 推送到远程 执行 `git push` 推送到远程仓库。如果当前分支没有上游跟踪,执行 `git push -u origin master` 设置上游并推送。 ## 输出格式 ### 成功时 ✓ 提交成功! - 提交信息: xxx - 变更文件: x 个新增, x 个修改, x 个删除 - 耗时: x 秒 - 远程推送: 已完成 ### 失败时 ✗ 提交失败 原因: [具体错误信息] 可能的原因: - 无可提交的内容(工作区干净) - 未连接到远程仓库 - 远程仓库拒绝推送(权限问题或冲突) - 网络连接失败 ### 无需提交时 ✓ 工作区没有可提交的内容 ## 注意事项 1. 始终使用 `git add -A` 暂存所有更改 2. 提交信息使用中文,简洁明了 3. 推送到当前分支的远程对应分支 4. 如果推送失败,尝试显示具体的 git 错误信息 5. 记录每个步骤的耗时,最后汇总报告frontmatter 里的name必须和目录名一致,description写清楚触发条件和功能范围,这样 Claude Code 在加载时能正确索引。disable-model-invocation: true是任务型 Skill 的标志,不加的话可能被意外触发。
执行步骤部分我拆成了五步,每一步都有明确的命令。第三步生成提交信息是核心,我让 Claude Code 先跑git diff --cached --stat拿到变更统计,再根据文件类型判断用feat:还是fix:。这里没有写死规则,而是给了判断依据,让模型自己决策。如果你想要更严格的规范,可以在注意事项里加一条“提交信息不超过 50 个字符”。
输出格式部分我用了✓和✗来区分成功失败,这样在终端里一眼就能看到结果。失败时列出可能的原因,方便排查。
如果你用的是 Claude Code 配合 TaoToken 的接入方式,需要在配置里确认 Base URL、API Key 和 Model ID 三件套都正确。Base URL 填https://taotoken.net/api,API Key 在控制台创建,Model ID 根据你用的模型填。这三项缺一不可,否则 Skill 执行到一半会因为请求失败而中断。
4. 本地验证自动提交、回滚与冲突提示
写完 Skill 之后,别急着在重要仓库里试。先建一个测试仓库,走一遍完整流程。
打开终端,创建一个临时目录并初始化:
mkdir gitpush-test && cd gitpush-test git init echo "# test" > README.md git add README.md git commit -m "init"然后随便改点东西,制造一个待提交的状态:
echo "new line" >> README.md echo "console.log('hello')" > app.js现在在 Claude Code 里输入/gitpush。正常情况下你会看到它先跑git status,然后git add -A,接着git diff --cached --stat,最后生成提交信息并推送。如果远程仓库还没配,推送那一步会报错,这是预期的。
验证提交是否成功:
git log --oneline -3你应该能看到一条新提交,信息是feat: 更新 README.md 并新增 app.js这类格式。
接下来测试回滚场景。假设你刚提交完发现提交信息写错了,或者漏了一个文件。先执行:
git reset --soft HEAD~1这会把最后一次提交撤销,但保留暂存区的更改。然后你可以修改文件,再次输入/gitpush,它会重新生成提交信息并提交。注意,如果远程已经推送过了,回滚后再次推送需要git push --force,这个操作有风险,Skill 里我没有自动加,需要你手动处理。
冲突提示的验证稍微麻烦一点。你可以模拟两个分支修改同一个文件:
git checkout -b feature-a echo "change from a" >> README.md git add . && git commit -m "a change" git checkout master echo "change from master" >> README.md git add . && git commit -m "master change" git merge feature-a这时候会产生冲突。如果你在冲突状态下输入/gitpush,Skill 会执行git add -A把冲突标记也暂存进去,然后提交。这不是我们想要的结果。所以我在注意事项里没有写“自动解决冲突”,而是让它在推送失败时显示具体错误。实际使用中,遇到冲突应该先手动解决,再触发 Skill。
验证完成后,你可以把这个 Skill 复制到用户级目录,在所有项目里使用。如果团队里有人也用 Claude Code,可以把SKILL.md提交到项目的.claude/skills/下面,这样克隆项目的人自动就有了这个 Skill。
5. 常见报错排查:401、local proxy failed 与 OAuth 问题
Skill 本身不复杂,但执行过程中可能遇到几类报错。我整理了几个真实遇到过的场景和排查方法。
401 Unauthorized:这个最常见,通常是 API Key 没配好或者过期了。如果你用的是 TaoToken 的接入方式,先检查~/.claude/settings.json或者项目里的配置文件,确认apiKey字段填的是控制台里创建的那串 Key。注意不要有多余的空格或换行。如果 Key 没问题,检查 Base URL 是不是https://taotoken.net/api,少写/api或者多写斜杠都会导致 401。
local proxy failed:这个报错说明 Claude Code 在尝试连接本地代理端口时失败了。如果你没有开代理,检查一下环境变量里有没有残留的HTTP_PROXY或HTTPS_PROXY设置。在终端里执行echo $HTTP_PROXY看看有没有输出,有的话用unset HTTP_PROXY清掉。Windows 下检查系统环境变量里的代理设置。
reading choices 相关报错:这个通常出现在模型返回格式不符合预期的时候。比如 Skill 执行到生成提交信息那一步,模型返回的内容里没有正确解析出feat:前缀。排查方法是手动跑一遍git diff --cached --stat,看看输出是否正常。如果 diff 内容太长导致模型处理超时,可以在 Skill 里加一条“如果变更文件超过 20 个,只提取前 10 个文件名用于生成描述”。
OAuth token 过期:如果你用的是 OAuth 方式登录 Claude Code,token 过期后会报认证失败。重新执行一次登录流程即可。如果同时配了 API Key 和 OAuth,优先使用 API Key。
推送被拒绝(non-fast-forward):这个不是 Skill 的 bug,是远程分支有你本地没有的提交。先执行git pull --rebase把远程变更拉下来,解决可能的冲突后再触发/gitpush。Skill 里我没有自动加--force,因为强制推送太危险。
工作区干净但 Skill 仍然执行:检查git status的输出,如果有未跟踪的文件但.gitignore里忽略了,git add -A不会暂存它们,git diff --cached --stat就是空的。这时候 Skill 应该输出“工作区没有可提交的内容”并结束。如果你发现它还是走了提交流程,检查一下SKILL.md里第三步的判断逻辑有没有写清楚。
排查的时候有一个通用技巧:在 Claude Code 里让它把每一步的命令和输出都打印出来。你可以在 Skill 的注意事项里加一条“每执行一条 git 命令后,输出该命令和返回结果”。这样出错时一眼就能看到是哪一步挂了。
6. 把重复操作交给 Skill,把精力留给真正重要的代码
写这个 Skill 之前,我每天至少要在终端里敲十几次 Git 命令。写完之后,大部分提交场景只需要一个/gitpush。省下来的时间不多,但省下来的脑力很值钱——不用再纠结 commit message 怎么写,不用再回忆git push -u origin后面跟什么。
如果你想让这个 Skill 更贴合自己的习惯,可以改几个地方。比如提交信息想用英文,把注意事项里的“提交信息使用中文”改成英文,再把格式模板换成feat:/fix:的英文描述。比如你用的是main分支而不是master,把第五步里的origin master改成origin main。比如你想在提交前自动跑一遍测试,可以在第二步和第三步之间插入一条“执行npm test,如果失败则终止流程”。
Skill 的编写门槛很低,一个 Markdown 文件就够了。真正难的是想清楚哪些操作值得固化下来。我的判断标准是:如果一个操作我每天重复超过三次,而且步骤固定、不需要临时决策,那就值得写成 Skill。Git 提交完全符合这个标准。
如果你还没配好 Claude Code 的接入环境,先去 TaoToken 控制台创建一个 API Key,然后在配置文件里填好 Base URL 和 Model ID。配好之后,把上面的SKILL.md复制到~/.claude/skills/gitpush/目录下,重启 Claude Code,输入/gitpush就能用了。遇到问题就回到第 5 节对照排查,大部分报错都有现成的解法。