AI编程中Git工作流的最佳实践

自从用AI编程工具之后,我发现Git的使用习惯需要做很大调整。AI生成代码的速度太快了,如果还按照以前的方式管理版本,很容易出问题。今天分享一下我总结的AI编程时代的Git最佳实践。

为什么AI编程需要不同的Git策略

先说说为什么传统的Git工作流在AI编程场景下会出问题。

以前手写代码,一天可能改几十行到几百行。代码变化是渐进的,你对每一行改动都有清晰的认知。出了Bug你大概知道是哪次改动引入的,回滚也好定位。

但用AI编程就不一样了。AI可能一次性生成几百行代码,十分钟内帮你重构一整个模块。如果你没有及时commit,一旦AI改出了问题,你很难分清哪些改动是好的、哪些是坏的。想回退?要么全部回退,要么一行一行看。

所以AI编程时代的Git策略核心就是一个词:精细化。

原子化提交:每个AI改动单独commit

这是我觉得最重要的一条原则。

所谓原子化提交,就是每次让AI完成一个独立的功能点或修改,就立刻做一次commit。不要让AI连续做好几件事之后才commit,那样一旦有问题根本分不清。

举个例子。你让AI帮你做三件事:给User模型加一个字段、写一个新的API接口、修复一个现有的Bug。正确的做法是让AI做完第一件事就commit,做完第二件事再commit,第三件事做完再commit。这样每个commit都是一个独立的、可回滚的改动。

我现在养成了一个习惯:每次让AI生成代码之前,先确认当前工作区是干净的。AI生成完代码后,跑一下测试确认没问题,立刻commit。然后再进行下一个任务。

这样做看起来commit次数会很多,但每个commit都很小、很清晰、可以单独回滚。比起一个包含二十个改动的大commit,出问题时定位和回退都方便得多。

分支策略:AI任务单独开分支

我现在的分支策略是这样的。

main分支只接受经过完整测试的代码。dev分支是日常开发分支。每次让AI做一个比较大的任务(比如新功能开发、大规模重构),我都会从dev上单独开一个分支。

分支命名规范是:ai/功能描述。比如ai/user-auth-refactor、ai/add-payment-module。这样一眼就能看出哪些分支是AI辅助开发的。

为什么要单独开分支?因为AI生成的代码有不确定性。有时候AI帮你做了一个改动,测试通过了,但过两天你发现引入了一个边界情况的Bug。如果改动在单独的分支上,你可以方便地revert整个分支的改动。如果直接在dev上改的,夹杂着你自己的改动,回退起来就很痛苦。

分支合并之前,我会做一次完整的Code Review和测试。确认没问题之后再merge到dev,然后删除AI任务分支。

Commit Message:让AI按规范生成

AI写commit message其实写得挺好的,前提是你给它明确的规范。

我用的是Conventional Commits规范,提交信息格式是:类型(范围): 描述。比如feat(user): add email verification功能,fix(order): resolve price calculation error,refactor(auth): simplify token validation logic。

我会在项目的配置文件里定义好commit message的规范,让AI每次生成代码的时候顺便给出对应的commit message。大部分时候AI给的commit message是准确的,偶尔需要微调。

一个小技巧是让AI在commit message里简要说明这次改动的原因和影响。比如不只是写"add email field to user model",而是写"add email field to user model for upcoming notification feature"。这样回溯历史的时候能快速理解每次改动的背景。

Code Review:AI PR + 人工审核

这一点非常重要。AI生成的代码一定要做Code Review。

我的做法是,AI任务分支开发完成后,创建PR(Pull Request)到dev分支。然后我自己做Code Review,重点关注几个方面。

第一是安全性。AI有时候会写出有安全隐患的代码,比如没有做输入校验、SQL注入漏洞、敏感信息硬编码等。这些必须人工检查。

第二是性能。AI写的代码有时候在功能上没问题,但性能不好。比如在循环里做数据库查询、没有加索引、内存泄漏等。

第三是一致性。AI有时候会引入和项目现有风格不一致的代码模式。比如项目用的是Repository模式,AI可能写了个直接操作数据库的方法。

第四是边界情况。AI容易忽略边界情况和异常处理。空值检查、超时处理、并发安全这些方面要重点关注。

如果你们是团队协作,我建议所有AI生成的代码都必须经过至少一个人的Review才能合并。不要因为AI写的代码能跑就直接合了。

回滚策略:AI代码出问题如何快速回退

前面说了原子化提交和单独分支,就是为了出问题时能快速回退。

具体的回滚策略分几种情况。

如果是某个具体的commit引入了Bug,用git revert加上那个commit的哈希值来回滚。这种方式最精确,不影响其他改动。

如果是整个AI任务分支有问题,直接在dev分支上revert merge commit就行了。整个分支的改动一次性回退。

如果AI的改动和你自己的改动混在一起了,那就比较麻烦。这种情况下可能需要cherry-pick你自己的改动到一个新分支上,然后把有问题的分支丢弃。所以再次强调,AI任务一定要单独开分支。

我还建议在做大规模AI重构之前打一个tag。比如git tag before-ai-refactor-auth。万一重构后的代码有严重问题,可以直接回退到tag的状态。

.gitignore对AI生成文件的处理

AI编程过程中会产生一些中间文件,这些文件不应该提交到仓库里。

AI的对话记录和上下文文件。有些AI工具会在项目目录下生成配置文件或缓存文件,要确保这些文件被gitignore了。

AI生成的临时测试文件。有时候让AI写的实验性代码,不打算合入主分支的,也应该放在gitignore里或者放在一个专门的临时目录。

提示词模板文件。如果你在项目里维护了给AI的提示词模板,这个要看情况。如果是团队共享的提示词规范可以提交,如果是个人的临时提示词就不需要。

我的.gitignore里专门加了几行用来处理AI相关文件。具体加什么取决于你用的AI工具,但原则是:只提交代码本身,不提交AI工具的中间产物。

总结

AI编程时代的Git工作流可以用六个关键词概括:原子化提交、独立分支、规范message、严格Review、便捷回滚、干净仓库。

这些实践的核心目的是让你在享受AI高效生成代码的同时,保持对代码版本的完全控制。AI写代码快,但出问题也快。好的Git习惯是你的安全网。

你们在AI编程中是怎么管理Git的?有没有其他好的实践可以补充?评论区一起聊聊。

3 个赞

Git工作流在AI编程时代确实需要重新设计。我的做法是每次让AI生成一个功能模块就立刻commit,commit message写清楚这是AI生成的还是自己改的。这样做有两个好处:一是出了问题可以精确回滚到某次AI生成之前;二是code review的时候reviewer知道哪些是AI写的需要重点检查。

分支策略我也调了:AI生成的代码先放feature分支,人工review通过后才合到develop。不要让AI直接在主分支上改代码,这是血的教训——我有一次让AI重构一个模块,它改出了一个隐蔽的bug,直接影响了线上数据,回滚花了两小时。

1 个赞

AI生成代码的commit频率确实要比手写高很多。我现在基本上是每十分钟一个commit,因为AI改代码太快了如果不频繁提交一旦出问题回滚的粒度太粗。

1 个赞

说个实用技巧:给AI生成的commit加个标签前缀,比如[AI]。这样git log一看就知道哪些是AI写的,review的时候可以重点关注这些。

强烈推荐用conventional commits规范。AI生成的代码用feat(ai):前缀,人工修改用fix:或refactor:前缀。配合commitlint做自动检查,团队协作不会乱。

.gitignore也要更新,AI工具的配置文件(.cursor/、.claude/等)要不要进版本控制各团队可以自己定,但至少要意识到这个问题

1 个赞

我有个极端做法:AI生成的每一版代码我都打一个git tag,方便随时对比AI修改前后的差异。虽然tag会比较多但关键时刻真的救命。

显存不够直接用API别折腾本地部署了

4090跑满血版还是吃力的建议量化

@maikele7 API便宜归便宜延迟高啊

国产显卡也能跑但驱动适配是个坑