前言

在使用 Claude Code 的过程中,我发现了一个非常实用的斜杠命令:/git-commit。这个命令实现了从简单的自动化提交到智能分支管理的完整演进过程。本文将记录这个命令从最初版本到现在的完整演变历程。


版本1.0:基础自动化提交

需求背景

最初的需求很简单:每次写完代码后,都要手动执行一系列 git 操作:

  1. git add .
  2. git status 查看变更
  3. git diff --cached 查看具体修改内容
  4. 手动思考写什么 commit message
  5. git commit -m "xxx"

这个过程虽然简单,但重复执行非常繁琐。

实现方案

创建了第一个版本的 /.claude/commands/git-commit.md

---
description: "【全自动】一键执行 git add . 并自动生成信息提交"
argument-hint: "[可选:指定提交意图或关键词]"
allowed-tools: Bash(git add:*), Bash(git diff:*), Bash(git status:*), Bash(git commit:*)
---

正在执行全量暂存操作...
!`git add .`

获取当前暂存区状态...
!`git status`

读取变更内容以生成日志...
!`git diff --cached`

你是一个高效的自动化构建助手。请根据变更内容生成符合 Conventional Commits 格式的中文提交信息。

功能特点

  • ✅ 自动执行 git add .
  • ✅ 自动分析代码变更
  • ✅ 生成符合规范的 commit message(feat/fix/docs 等)
  • ✅ 支持手动指定提交意图参数

使用方式

# 自动生成提交信息
/git-commit

# 指定提交意图
/git-commit 优化用户认证逻辑

版本2.0:分支检测与条件推送

新需求

在实际使用中,我创建了本地分支 local-minote 用于跟踪不希望推送到远程的文件(如个人笔记 minote/)。这时遇到了问题:

  • local-minote 分支的提交不应该推送到远程
  • main 分支的提交需要推送

实现方案

在版本1.0的基础上添加了分支检测和条件推送逻辑:

---
allowed-tools: Bash(git add:*), Bash(git diff:*), Bash(git status:*), Bash(git commit:*), Bash(git branch:*), Bash(git push:*)
---

获取当前分支信息...
!`git branch --show-current`

# ... 省略前面的逻辑 ...

3. **条件推送**
*`git branch --show-current` 的输出获取当前分支名称。
* **如果当前分支是 `main`**:执行 `git push` 推送到远程仓库。
* **如果当前分支不是 `main`**:跳过推送,只保留本地提交。

功能特点

  • ✅ 自动检测当前分支
  • main 分支:commit + push
  • ✅ 其他分支:只 commit,不推送

使用效果

# 在 main 分支
/git-commit
# → git add . → git commit → git push ✅

# 在 local-minote 分支
/git-commit
# → git add . → git commit(不推送)✅

版本3.0:智能文件检测与双分支同步(当前版本)

新需求

使用版本2.0一段时间后,又发现了新的问题:

虽然 local-minote 分支不会推送,但实际工作流程是:

  1. 一直在 main 分支工作
  2. 偶尔会修改 minote/ 文件夹(个人笔记)
  3. 修改 minote/ 后,需要手动切换到 local-minote 分支提交
  4. 再切回 main 分支提交其他内容

这个流程依然繁琐。

期望的工作流程

核心需求:自动检测 minote/ 是否有变更,智能决定处理方式。

场景1:minote/ 没有变更

保持当前分支不变

git add .

生成提交信息

git commit

如果当前是 main → git push ✅
如果当前是 local-minote → 不推送 🚫

场景2:minote/ 有变更

如果在 main 分支

切换到 local-minote 分支

git add . + commit(包含 minote/)

切换回 main 分支

git add . + commit + push(不包含 minote/)

如果在 local-minote 分支

git add . + commit(包含 minote/)

切换到 main 分支

git add . + commit + push(不包含 minote/)

实现方案

---
allowed-tools: Bash(git add:*), Bash(git diff:*), Bash(git status:*), Bash(git commit:*), Bash(git branch:*), Bash(git push:*), Bash(git checkout:*)
---

## 🤖 任务指令

### 前置检测:检查 minote/ 是否有变更

从 `git status` 的输出中检查 `minote/` 目录是否包含未暂存的变更。

### 逻辑分支 A:minote/ **有变更**

#### 如果当前在 `main` 分支:
1. **切换到 local-minote 分支**
- `git checkout local-minote`
2. **执行全量暂存** → `git add .`
3. **读取变更内容** → `git diff --cached`
4. **生成提交信息**并执行提交
5. **切换回 main 分支** → `git checkout main`
6. **在 main 分支重复执行**
- `git add .`
- `git diff --cached`
- **生成提交信息**(不包含 minote/ 的变更)
- `git commit -m "你的提交信息"`
7. **推送到远程** → `git push`

# ... 省略其他分支的逻辑 ...

关键技术点

**1. 不同分支的 .gitignore**:

  • main 分支.gitignore 包含 minote/
  • local-minote 分支.gitignore 不包含 minote/

这样切换分支时,.gitignore 会自动切换,minote/ 的变更只在 local-minote 分支被跟踪。

2. 文件变更检测

通过 git status 输出判断 minote/ 是否有变更:

  • 有变更 → 触发双分支处理流程
  • 无变更 → 单分支正常处理

3. 分支隔离配置

# 配置 local-minote 分支不推送
git config branch.local-minote.pushRemote no_push

功能特点

  • ✅ 自动检测 minote/ 变更
  • ✅ 智能切换分支处理
  • minote/ 变更永远只在 local-minote 分支(本地备份,不推送)
  • ✅ 其他文件变更提交到 main 并推送
  • ✅ 最终停留在 main 分支

使用效果

# 一直在 main 分支工作
# 情况1:只修改了代码文件
/git-commit
# → git add . → git commit → git push ✅

# 情况2:修改了代码 + minote/ 笔记
/git-commit
# → 检测到 minote/ 有变更
# → 切换到 local-minote → commit(包含 minote/)
# → 切换回 main → commit + push(不包含 minote/)
# → 最终停留在 main 分支 ✅

技术总结

版本对比

特性 版本1.0 版本2.0 版本3.0
自动 add
生成提交信息
自动 commit
分支检测
条件推送
文件变更检测
自动切换分支
双分支同步

核心技术点

1. Slash Command 的 allowed-tools 配置

每次功能迭代都需要添加新的工具权限:

# 版本1.0
allowed-tools: Bash(git add:*), Bash(git diff:*), Bash(git status:*), Bash(git commit:*)

# 版本2.0
allowed-tools: ..., Bash(git branch:*), Bash(git push:*)

# 版本3.0
allowed-tools: ..., Bash(git checkout:*)

2. Git 工作流与分支策略

  • 利用 .gitignore 的版本控制特性实现不同分支的文件跟踪策略
  • 通过 git config 配置分支级别的推送行为
  • 结合 Slash Command 的自动化能力实现智能工作流

3. 渐进式功能演进

从简单的自动化到智能决策,每次迭代都基于实际需求,逐步完善功能。


后续优化方向

可能的改进

  1. 更智能的提交信息生成

    • 结合变更的文件路径生成更准确的 commit message
    • 支持自定义提交信息模板
  2. 更灵活的配置

    • 支持配置多个本地备份分支
    • 支持配置不同的文件匹配规则
  3. 交互式确认

    • 在执行分支切换前提示用户确认
    • 显示将要提交的内容摘要
  4. 错误处理

    • 处理分支切换失败的情况
    • 处理合并冲突的情况

结语

从最简单的自动化提交,到智能的多分支管理,/git-commit 命令的演进过程展示了如何通过持续优化来提升开发效率。

核心思路

  • 识别重复性操作
  • 逐步自动化
  • 根据实际需求迭代优化

这个命令不仅节省了大量时间,更重要的是建立了一套可靠的工作流程,让代码管理变得轻松而规范。


参考资源