一、痛点:重复而机械的 Git 工作流
每次开发新需求,你是否也要重复这一套流程?
- 拉取最新主分支
- 创建新分支
feat/xxx - 写代码
- 提交:
git commit -m "feat: xxxxx" # 还得想怎么写
git push origin feat/xxx
- 去 GitLab 手动新建 Merge Request
- 还可能需 rebase 主分支:
git checkout main
git pull origin main
git checkout feat/xxx
git rebase main
这些操作重复、琐碎,且 Commit 消息写起来费神,MR 描述更难写全面。
二、解决方案:AI CLI —— 一条龙自动化
因此我开发了一个 Git + AI 命令行工具,帮你自动化以上流程,并让 AI 生成规范的 Commit 和 MR 描述。
| 命令 | 功能 | 适用场景 |
|---|---|---|
ai git commit | rebase + commit + push + 创建 MR | 完整流程,确保代码与主分支同步 |
ai git mr | commit + push + 创建 MR | 已有本地更改,直接提交并提 MR |
ai git add | add + commit(可选 push) | 仅提交到本地,暂不提 MR |
三、技术实现亮点
1. 智能生成 Commit 消息
通过 git diff --cached 获取暂存区改动,发送给 AI(使用token调用AI接口),生成符合 Conventional Commits 格式的消息。
prompt
请分析以下代码改动,生成一个简洁的 commit message(格式:type: description)。
要求:
1. 使用常见的 commit type(feat, fix, docs, style, refactor, test, chore)
2. 描述要简洁明了,不超过 50 个字
3. 只输出 commit message,不要其他说明
代码改动:${diff}
2. 自动创建 MR(使用 GitLab CLI glab)
- 检查是否已有 MR
- 获取与主分支的 diff 和 log
- 调用 AI 生成 标题 + 详细描述(含改动点、影响范围、风险)
3. 防止 AI Token 超限
- Commit 时:对 diff 长度截断
- MR 时:仅提取关键文件(新增文件或修改函数超过50行的文件)
4. 健壮的 Git 操作封装
- 自动检测主分支(main/master)
- 支持 stash → rebase → pop 流程,处理冲突中断
- 使用
git status --porcelain解析状态,避免人工解析输出
5. 多环境配置支持
通过 dotenv 按优先级加载 .env 文件,方便在不同目录下使用。
四、示例流程
使用 ai git commit:
# 1. 在 feat/0130 分支开发完毕
# 2. 一键完成:
ai git commit --main-branch main
# 工具会:
# ✅ 拉取最新 main
# ✅ stash → rebase → pop(如有冲突会暂停)
# ✅ 自动 add
# ✅ AI 生成 commit message(可编辑确认)
# ✅ 推送分支
# ✅ 创建 MR(AI 生成标题和描述)
五、遇到的问题与解决方案
| 问题 | 解决方案 |
|---|---|
| AI token 可能超限 | 对 diff 智能截断,只提取关键改动 |
| 冲突处理中断流程 | 采用 stash 机制,冲突时中断并提示用户解决 |
| 不同项目主分支名不同 | 支持 --main-branch 参数,默认检测 main 或 master |
| 需兼容不同 GitLab 实例 | 使用 glab auth login 提前认证,支持自托管 GitLab |
六、未来改进方向
- 交互确认:AI 生成的 Commit 和 MR 信息可编辑后再提交
- 本地模型支持:接入 Ollama,保护代码隐私,减少 API 调用成本
- 多平台支持:除了 GitLab,也支持 GitHub(通过
ghCLI) - Commit 规范校验:在 AI 生成后,自动校验是否符合团队规范
- 可视化冲突解决:在 rebase 冲突时提供更友好的解决界面
- 错误处理与回滚:在 rebase 或 push 失败时,应有更安全的回滚机制
- 配置化:允许用户自定义 AI prompt、Commit 类型映射等
- 进度提示:长时间操作(如 AI 调用、网络请求)应有 loading 提示