我让AI替我写Git提交信息,老板以为我每天工作16小时

公司要求提交信息必须规范:feat: xxxfix: xxx、还要带tapd链接。我每次 git commit 都要憋五分钟,写出来的还是"改了点东西"。后来我让 AI 替我写提交信息------diff 一丢进去,它自动生成规范格式,还帮我加上"影响范围"和"为什么改"。老板看 Git 日志,说:"xxx 最近提交质量很高啊,你每天工作到几点?" 我:"正常六点下班。"

前言

Git 提交信息这件事,说大不大,说小不小。小到你随便写个"update",不影响跑代码。大到代码回滚、发版生成 CHANGELOG、甚至背锅溯源时,一句清晰的"fix: 修复订单金额计算溢出" 比"改了一下"值一万倍。

但人都有惰性,尤其加班赶业务时,谁有空写小作文?AI 就不一样,它看 diff 快、理解上下文、还能按约定格式输出。今天我就教你用 AI 自动生成高质量的 commit message,顺便集成到 Git 钩子里,让你以后闭着眼敲 git commit 就行。

一、为什么你讨厌写 commit message?

  • 没灵感:改了好几个文件,不知怎么概括。
  • 规范记不住feat/fix/docs 又要查表。
  • :反正也没人看,写个"x"交差。

但规范化的 message 真的有用:

  • 自动生成 CHANGELOG.md
  • git blame 时一眼看出某个改动的原因。
  • 同事 review PR 时不用猜你改了啥。

既然人是懒的,就让 AI 当你的"秘书"。

二、AI 怎么写 commit message?

核心思路:git diff --staged 拿到本次变更的代码差异,丢给 AI,让它根据 Conventional Commits 规范生成消息。

我给你写了一个脚本 ai-commit(Python 版,你也可以用 Node):

python 复制代码
#!/usr/bin/env python3
import subprocess
import sys
from openai import OpenAI

client = OpenAI(api_key="你的key")

# 获取暂存区的 diff
diff = subprocess.check_output(["git", "diff", "--staged"]).decode("utf-8")
if not diff.strip():
    print("没有暂存的变更,请先 git add")
    sys.exit(1)

prompt = f"""
请根据以下 Git diff,按照 Conventional Commits 规范生成一条提交信息。
格式:<type>(<scope>): <subject>
其中 type 可选:feat, fix, docs, style, refactor, perf, test, chore
scope 可选(如组件名或模块名),subject 简短描述(不超过50字)。
如果变更涉及多个不相关改动,请拆成多条(用换行分隔)。
只输出提交信息,不要解释。

diff:
{diff[:8000]}
"""

response = client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": prompt}],
)

message = response.choices[0].message.content.strip()
print(message)

把这个脚本保存为 ai-commit,放到 PATH 里。以后你只需要:

bash 复制代码
git add .
ai-commit   # 它会打印出 AI 生成的 message
git commit -F <(ai-commit)   # 直接使用

或者再懒一点:用 git commit -m "$(ai-commit)" 一行命令。

三、集成到 Husky,每次 commit 自动调用

你可以在 .husky/prepare-commit-msg 里加入脚本,让 AI 自动填充编辑器:

bash 复制代码
#!/bin/sh
# 自动生成 commit message 并预填到编辑器
exec < /dev/tty
AI_MSG=$(ai-commit)
echo "$AI_MSG" > "$1"

这样你敲 git commit 时,编辑框里已经有 AI 写好的草稿,你只需要检查一下,不满意就改,省得自己从头敲。

四、真实案例:AI 写的 message 有多专业?

某次我改了订单模块的一个 bug:之前只判断了 user.discount 存在性,没判断类型,传了个字符串导致计算错误。AI 根据 diff 生成了:

diff 复制代码
fix(order): 优惠金额类型错误导致计算异常

- 增加 discount 字段的类型校验,确保为 number
- 添加单元测试覆盖字符串场景

还帮我分了一行 body 说明?其实 Conventional Commits 允许 body,但我的提示词没要求。厉害的是 ,它居然知道这是"类型错误"和"计算异常",而且自动给定了 fix(order)

另一个案例:我重构了一个函数,把 if-else 改成了策略模式。AI 生成:

scss 复制代码
refactor(payment): 用策略模式替换多层条件分支

提升可扩展性,便于新增支付渠道

这一看就是老手写的。

五、进阶:结合 TAPD/Jira,自动关联任务

很多公司要求 commit 里带任务 ID。你可以在提示词里加入当前分支名(分支名通常含任务号):

python 复制代码
branch = subprocess.check_output(["git", "branch", "--show-current"]).decode().strip()
# 假设分支名为 feature/TAPD-1234

然后把"请从分支名提取任务ID,加入提交信息"写进 prompt。AI 会生成类似:

scss 复制代码
feat(order): 添加满减优惠券

TAPD-1234

连 hook 都不用改,全自动。

六、局限性:AI 不是每次都完美

  • 巨大 diff :超过上下文长度,AI 看不到全貌。可以只改最近几个文件,或者用 git diff --cached --stat 先给 AI 看概览,再让它选择重点文件。
  • 多个无关改动:AI 可能会合并成一条,而你应该拆成多条。这时候手动分两次 commit 就好。
  • 隐私:代码 diff 会发给 OpenAI API,公司敏感项目慎用。可以本地跑开源模型(CodeLlama、DeepSeek Coder)替代。

七、效果:我的 Git 日志变"教科书"

之前我的日志:

sql 复制代码
fix
update
修改

现在:

scss 复制代码
feat(user): 支持手机号登录
fix(cart): 修复商品数量为0时仍可结算的bug
perf(list): 虚拟滚动优化,长列表滚动帧率提升50%
docs(readme): 更新环境配置说明

老板进仓库看了一圈,专门在群里说:"xxx 的提交信息写得真规范,大家学习一下。" 我默默把 AI 脚本分享给了同事。现在全组都在用,老板还纳闷:怎么大家突然都变"专业"了?

八、总结:把时间花在改 bug 上,不是写小作文

  • AI 写 commit message,省时、规范、专业。
  • 集成到 Git 钩子,无感使用。
  • 支持从 diff 推断 type、scope、甚至业务含义。
  • 敏感项目换本地模型。

下一回你 git commit 时,让 AI 替你写。你只需要 review 一下,不满意手动改两字。从此 Git 日志不再是"xxx: 111",而是真正的"项目史书"。


评论区聊聊:你见过最离谱的 commit message 是什么?

相关推荐
接着奏乐接着舞1 小时前
react native expo打包
javascript·react native·react.js
简简单单就是我_hehe2 小时前
高效掌握 JeecgBoot JSelect 组件:外部传参、搜索回显与默认值设置全攻略
前端
闲适达人2 小时前
nginx传递url的获取方案
java·服务器·前端
石小石Orz2 小时前
给Claude增加状态栏显示:claude-hud保姆级教程
前端·人工智能·后端
chushiyunen2 小时前
typescript笔记、ts笔记、npx命令
javascript·笔记·typescript
ZC跨境爬虫2 小时前
跟着 MDN 学 HTML day_55:HTML 音频与视频嵌入实战指南
前端·javascript·ui·html·音视频·媒体
27669582922 小时前
阿里图像修复验证码自动化分析
java·前端·自动化·阿里滑块·drssionpage·阿里图像修复验证码·阿里图像复原
Jack N2 小时前
2026 浏览器原理 常见面试题(附答案)
前端·html·浏览器