ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI改造老项目,先手敲Git:30分钟建立版本控制安全基线

AI改造老项目,先手敲Git:30分钟建立版本控制安全基线 把一个跑了三年多的老项目交到 ClaudeCode 手里动“手术”之前我给自己定的第一条规矩不是急着写代码而是先把 Git 命令老老实实手敲一遍。原因很简单AI 改写老项目的时候会一次性碰几十个文件如果没有版本控制兜底改崩了连后悔药都没有。这篇就是改造第一天的记录核心任务只有一个花 30 分钟把 Git 捡起来所有命令必须亲手敲坚决不复制粘贴也不让 AI 代劳。为什么非要“自己手敲”因为我发现一个很现实的问题让 AI 写提交信息、让 AI 生成 git 命令看着很爽但你根本记不住仓库状态更看不懂 diff 里哪些改动是 AI 自作主张加进去的。版本控制是改造工程的“安全带”安全带得自己扣。这套方法适合正在用 ClaudeCode、Cursor 这类编程助手改造老项目但 Git 基础不太牢的朋友也适合所有想快速上手 Git 又不愿意靠死记硬背的人。1. 改造老项目的第一天为什么先啃 GIT1.1 老项目改造的真实痛点我手上这个老项目的问题非常典型代码库已经跑了三年多中间换过好几拨人没有规范的提交历史目录里还堆着各种config.local.php、xxx_old.sql这类历史遗留文件。最麻烦的是项目一直没用 Git 管理我接手的时候连一份完整的可回滚快照都没有。用 ClaudeCode 做第一轮“探测器”扫描时它一口气分析了 200 多个文件那种感觉就像进了一间三年没收拾过的仓库想整理又怕一动手就把承重墙拆了。这种情况下AI 的能力再强也不敢直接让它放开手脚改。ClaudeCode 能理解代码能生成重构方案但它不知道哪些文件是“绝对不能动的生产配置”也不知道哪个分支才是当前稳定版本。这些信息只存在于人的脑子里准确说只存在于用 Git 把人脑信息“结构化”之后。所以我第一天的工作不是改造代码而是先把整个项目纳管进 Git建立第一个干净的基线让后续每一步 AI 改动都有迹可循。1.2 为什么是 30 分钟而不是 3 天很多人一提 Git 就头大觉得要学一堆命令、理解一堆概念。但实际改造老项目时你马上要用到的核心操作就那么十几个提交、查看、分支、合并、拉取、推送、回滚。这些命令从安装到上手30 分钟足够。我刻意把学习时间压到半小时是因为成年人的学习效率取决于“用完即走”的即时反馈——你不需要成为 Git 专家只需要能安全地把 AI 的改动“装进盒子”里。另外还有个心理层面的原因如果第一天就把大量时间花在系统学 Git 上很容易产生“我到底是来改造项目还是来学 Git”的挫败感。30 分钟的定位很微妙刚好够你建立起“提交-分支-回滚”的最小心智模型又不至于耽误主线任务。贪多嚼不烂剩下的高级操作rebase、cherry-pick、submodule等真碰到场景了再查反而记得更牢。1.3 ClaudeCode 和人的分工怎么切CLAUDE CODE 这类 AI 编程工具最大的价值是把“写代码”的成本打下来但它管不住“怎么改”的节奏。我用 ClaudeCode 之前就想清楚了一条分工线AI 负责生成代码建议、批量替换、结构分析我负责所有跟“版本状态”相关的事情——建分支、看 diff、控制提交粒度、合并冲突。人是飞机的机长AI 是自动驾驶但起飞降落、切换航向这些关键动作必须人来操作。这个分工还有一个实际原因ClaudeCode 跑完一轮重构后会给你列出“我改了这些文件”但你如果不用git diff自己复核一遍根本不知道它的改动里有多少是“顺手格式化”有多少是“偷换了逻辑”。我第一次跑完git diff的时候发现它对一个老函数做了变量重命名看起来人畜无害但那个函数在其他地方被字符串拼接引用一改名线上直接报错。这种锅AI 不会背最后还是得靠 Git 的审计能力来兜。2. 动手前的准备安装配置与初始化细节2.1 三件套Git 本体、终端、编辑器这个环节没什么玄学但有几个选择会影响后面顺不顺手。Git 本身建议直接到官网下载最新版Windows 用户注意安装时选 “Git from the command line and also from 3rd-party software”免得后面在 VS Code 或者其它 IDE 里调用时找不到命令。装完先验证一下git --version然后是终端的选择。我在 Windows 上直接用了 PowerShell但把编码设置改成了 UTF-8避免老项目里的中文注释在终端里乱码。如果你用的是 macOS自带的 Terminal 就够用重点是别用记事本写命令——我见过不少新人把自己折腾到想砸电脑最后发现是复制命令时把换行符和不可见字符一并带上了。所有命令手工敲一遍这个坑能躲掉一半。编辑器这块我用的就是 ClaudeCode 自带的交互终端因为它和git diff配合得很好。但这里要提醒一句不要让 ClaudeCode 直接帮你执行git命令至少在第一天不要。我发现它偶尔会“自作聪明”地加参数比如git push --force这在老项目协作里是灾难级的操作。自己手敲一来能记住命令二来能防止 AI 的“过度热心”。2.2 一次性配置好用户信息与 SSH 免密装好 Git 后第一件事是配置身份否则每次提交都会弹出“请告诉我你是谁”的提示。直接执行git config --global user.name 你的名字 git config --global user.email 你的邮箱这里有个细节邮箱最好和你远程仓库比如 Gitee 或 GitHub的邮箱保持一致因为很多平台的“贡献者”统计是靠邮箱关联的。如果你不想暴露真实邮箱平台也支持设置隐私邮箱但千万别随便填一个——我见过有人用testtest.com提交了一年最后想找回提交记录时完全对不上人。然后是 SSH 免密配置。老项目改造往往要频繁 push/pull每次输密码会把人逼疯。生成密钥的命令也建议自己敲不要用什么一键脚本ssh-keygen -t ed25519 -C 你的邮箱之后一路回车默认生成在用户目录的.ssh文件夹里。把id_ed25519.pub里的内容复制到 Gitee 或 GitHub 的 SSH 公钥设置页。验证是否配置成功ssh -T gitgitee.com看到 “Hi xxx! You’ve successfully authenticated” 之类的提示就说明通了。这一步是我遇到的坑最多的环节后面单独说。2.3 两个不起眼但能省一周命的配置第一个是换行符。老项目可能当初是在 Windows 上开发的也可能在 Linux 服务器上改过代码文件的换行符往往混着CRLF和LF。如果不做配置Git 会在提交时疯狂提示“整个文件都变了”diff 里全是空行变化根本看不出真实改动。我的做法是用全局配置统一转换策略git config --global core.autocrlf true这样在 Windows 上检出时光自动转成CRLF提交时又自动转回LF老仓库的 diff 干净很多。第二个是文件名大小写。老项目里如果存在Foo.php和foo.php这种名字在 Windows/macOS 上默认不区分大小写Git 有时会“看不见”文件名的改动导致部署后类找不到。保险起见给仓库设置git config core.ignorecase false这两个配置不写在 30 分钟命令清单里但它们是改造老项目的“隐形基础设施”。没配好后边 ClaudeCode 帮你重构的时候你会在 diff 的茫茫大海里迷失自我。3. 三十分钟必须手敲的 Git 命令清单3.1 前十分钟提交与查看建立肌肉记忆这段的核心是形成“提交之前先检查提交之后能回溯”的本能。我按实操频率把它们排了个序每个命令都值得亲手敲一遍不要复制git init # 把当前目录变成 Git 仓库 git status # 查看工作区状态你会天天用它 git add . # 把当前目录所有改动加入暂存区 git commit -m 第一次基线提交老项目初始化 # 生成一个提交点 git log --oneline # 用简洁模式看提交历史这里最反直觉的一个动作是git add .。很多教程会让你“谨慎使用”因为可能把不该提交的文件加进去。但对于第一天纳管老项目来说我会专门建一个.gitignore把明显不能进仓库的东西拦住下面实操环节会讲然后大胆git add .先把基线建立起来。等基线稳定了再慢慢收紧提交粒度。git status是我教所有新人必须“强迫自己每次动手前先敲一遍”的命令。它会明确告诉你你现在在哪个分支、有什么文件被改过、什么文件还没有被跟踪。配合 ClaudeCode 改造场景我通常会看两遍 status——让 AI 动手前看一遍确认工作区干净AI 改完后再看一遍确认它没有动我计划外的文件。3.2 中十分钟分支与合并给 AI 划一条跑道老项目改造最怕的就是“直接在主线上一通乱改”。让 ClaudeCode 高兴起来几分钟就能生成上千行新代码但这些代码在没有分支保护的情况下会把整个项目拖入不稳定状态。所以中十分钟的重点是分支操作git branch feature/refactor-login # 新建一个改造专用分支 git checkout feature/refactor-login # 切换到该分支 git switch -c feature/refactor-login # 上面两条的合并写法新版 Git 推荐 git branch # 列出所有分支当前分支前面有个* git merge feature/refactor-login # 把分支合并回主线我强烈建议在让 ClaudeCode 干活之前先手动开出分支并且用git switch -c这种带“创建并切换”语义的命令一步到位。分支名字最好能看出来用途比如refactor-login、fix-upload-encoding不要用test1、aaa这种不然三天之后你自己都看不懂。合并这个动作我在第一天的策略是“能不合并就不合并”。改造才刚开始主线保持干净所有 AI 改动先堆在分支里。哪怕 ClaudeCode 说“我已经全部改好了”我也只是切回主分支git diff看看总改动量不急着 merge。等一个小阶段彻底验证完再合并一次。合并时如果弹冲突别慌后面有专门一节讲。3.3 后十分钟远程协作与回滚学会“后悔”的艺术改造老项目通常不是你一个人在战斗远程仓库是队友的交接点。这部分命令包括git remote add origin gitgitee.com:你的账号/仓库名.git git remote -v # 查看远程仓库地址 git push -u origin main # 第一次推送-u 记住关联关系 git pull # 拉取最新代码 git fetch # 只拉取不合并先看看别人改了什么 git reset --hard HEAD~1 # 撤销最近一次提交丢弃改动 git reset --soft HEAD~1 # 撤销提交但保留文件改动 git stash # 临时存起当前改动腾出干净工作区git reset是我在改造期最常用的“后悔药”。做一个大改动前我会用一个简单 commit 打个“存档点”如果 ClaudeCode 的后续操作把代码改坏了直接git reset --hard秒回存档点。但注意--hard会丢掉所有未提交的改动使用前务必git status确认没有漏网之鱼。git stash这个命令对老项目尤其好用。比如我正在改造登录模块临时接到一个线上 bug 要马上修但我又不舍得把改了一半的东西提交。敲一下git stash工作区瞬间干净修完 bug 后再git stash pop半成品原样回来。我私下管它叫“暂停键”用一次就离不开了。4. 让老项目真正进入 Git第一次实操片段4.1 从零建立基线先给项目拍一张“全家福”拿我改造的这个项目举例它既没有 Git 历史也没有 .gitignore目录里还散落着缓存、日志、上传文件。第一次纳管不能莽我先把“绝对不能进仓库”的文件清单列出来然后写进.gitignore# 依赖与构建产物 vendor/ node_modules/ dist/ *.log # 本地配置与环境变量 .env *.local.* config/secret.php # 缓存与临时文件 cache/ tmp/ /uploads/* !/uploads/.gitkeep # 操作系统文件 .DS_Store Thumbs.db第一版 .gitignore 不需要很完美但要把敏感文件和体积巨大的目录挡在外面。比如.env里可能有数据库密码一旦提交到远程仓库再删掉历史处理起来非常麻烦属于“开始就别犯错”的典型场景。写好后执行git init git add . git commit -m chore: 初始化仓库建立基线版本这里有一个值得专门说明的小技巧git add .之后先执行一次git status看看到底有哪些文件将被提交确认没有.env、没有几百 MB 的缓存目录再 commit。第一次提交我特意没有让 ClaudeCode 帮忙写 commit message因为这种关键节点必须自己掌控也算是对“手敲记住”这个原则的以身作则。4.2 纳管之后立刻给 AI 划出改造跑道基线建立后我没有直接让 ClaudeCode 开工而是先创建了一个长期存在的改造分支git switch -c refactor/phase1-module-scan这一步的作用相当于给 AI 划出了一条“跑道”它可以在这个分支里随便折腾主分支永远保持可上线状态。然后我才拉起 ClaudeCode让它基于当前分支开始扫描老项目。整个操作顺序非常关键先有分支再让 AI 动手。顺序反了AI 就会直接污染主分支你后面想选择性保留都很难。ClaudeCode 扫描完会输出一份“诊断报告”我的第一反应不是看它说了什么而是先敲git status看它碰了哪些文件。我遇到的情况是它确实只读了代码没有改动任何文件但工作区也不完全干净——一些日志文件因为程序运行被刷新了。这时我学会了用git checkout -- 文件名把干扰文件还原这个命令也建议你亲手敲几遍因为它是“让工作区回到指定状态”的常用手段。4.3 让 AI 边改边提交谁的改动谁留痕改造过程中我给自己定了一个强迫症级别的纪律每当 ClaudeCode 完成一个独立的小任务比如“优化了登录模块的验证逻辑”我就亲手执行一次“提交三步曲”git status git diff git commit -m refactor: 登录模块验证逻辑优化这里的关键不是 commit 本身而是中间的git diff。ClaudeCode 的输出我可不敢直接全盘接收必须看一眼它到底改了什么逻辑。比如它经常会把单引号改成双引号把改成这些本身没问题但如果在同一个 commit 里混入大量格式调整和真正的逻辑修改将来排查 bug 时根本分不清哪个改动导致的问题。所以我在每日协议里加了一条AI 的“顺手格式化”我不要真正跟任务相关的改动才留下其他的一律git checkout掉。这样做的另一个好处是每一条提交记录都像一条“证据链”出问题能快速定位到具体是哪个微重构引入的缺陷。第一天改造结束后我回头翻git log --oneline看到的不再是“一堆乱七八糟的改动”而是一组主题清晰、粒度合适的提交。这种感觉才是老项目改造该有的安全感。5. 第一天踩过的 Git 坑每个都能教你做人5.1 SSH 认证失败八成是公钥没配对我一上来就撞到了这个坑git push报Permission denied (publickey)。排查思路其实很简单先执行ssh -T gitgitee.com看能不能连上如果提示 “Permission denied”说明本地密钥和远程公钥没有配对成功。常见原因有三个一是id_ed25519.pub复制的时候漏了个字符二是复制成了私钥id_ed25519这个绝对不行三是平台后台的公钥还没刷新等几分钟再试。还有个隐秘的坑老项目可能之前用别的 Git 账号配置过密钥本地~/.ssh/config里写死了某个IdentityFile。遇到这种情况可以临时指定密钥验证一下ssh -i ~/.ssh/id_ed25519 -T gitgitee.com能通就是配置路径问题把全局 SSH config 改对就行。这里我不建议用GIT_SSH_COMMAND环境变量去绕因为绕来绕去会把环境搞得更乱最终还是要回归“标准配置”。5.2 .gitignore 不生效你以为挡住了其实早就被跟踪了第一天我犯了一个非常典型的新手错误先把一堆缓存文件git add进了仓库然后才写.gitignore结果缓存文件依然被 Git 跟踪.gitignore完全不生效。原因很简单.gitignore只对未被跟踪的文件起作用已经进过暂存区或历史提交的文件它管不着。正确的做法是先把它们从暂存区移除再补上忽略规则git rm -r --cached cache/ git commit -m chore: 移除缓存目录的版本跟踪注意这里的--cached很关键它只删除 Git 的跟踪记录不会动磁盘上的真实文件。之后我就学乖了凡是老项目里明显属于“本地产物”的目录缓存、日志、上传文件在开始改造的第一时间就写进.gitignore绝不拖到最后。只要吸取一次教训你就会建立条件反射新建目录先问一句“这东西该进 Git 吗”。5.3 合并冲突不要慌先看冲突标记长什么样第一次让 ClaudeCode 在分支上完成一轮重构后我试着把它合并回主线结果报了一堆冲突。看到CONFLICT (content): Merge conflict in src/Auth.php时内心其实有点慌但打开文件看到那些熟悉的标记就释然了 HEAD // 旧逻辑直接查询数据库 $user $db-query(...); // 新逻辑先查缓存再查数据库 $user Cache::remember(user_.$id, function() use ($db) {...}); refactor/phase1-module-scan处理的原则很简单看两遍代码想清楚哪个版本是符合当前需求的保留正确的删除两个标记和多余的内容然后保存文件。对于我这次改造新逻辑明显是 ClaudeCode 有意重构的所以我把旧版删掉保留了新版。之后执行git add src/Auth.php git commit -m merge: 合并登录模块重构分支这里有个经验之谈遇冲突的核心不是“你会不会删标记”而是“你能不能看懂两边的代码意图”。如果 ClaudeCode 的改动把逻辑绕了三层你完全看不懂就别硬合。正确做法是先git merge --abort回到合并前状态再去问 ClaudeCode “你这两边到底改了什么给我解释清楚”然后重新合并。硬着头皮乱选只会把老项目改出一个新的定时炸弹。5.4 手滑提交、误删改动救命的 reflog 与 stash第一天我还干过一件蠢事想把某个文件的改动撤回结果敲成了git reset --hard HEAD~1直接把上一个提交连同文件改动一起扔掉了。反应过来时冷汗都下来了但这个教训反而让我学会了真正好用的命令git reflogreflog可以看成 Git 的“操作流水账”它会记录你每一次 HEAD 移动的痕迹。哪怕是误删的提交只要操作过就能从 reflog 里找回 hash然后执行git reset --hard 对应hash一键还原。这条命令是我认为“手敲记住”清单里最值得加入的一条因为你迟早会手滑但知道怎么反悔就等于拥有了一张永不过期的后悔药。同理如果只是工作区有未提交的改动被误清了但之前 stash 过git stash list能看到历史 stash 记录git stash pop还能把它们捞回来。我把这些“保命命令”用一个大号便利贴贴在显示器边上现在就算再用 ClaudeCode 做更激进的改动心里也有了底气。6. 第一天收尾让“手敲 Git”成为改造工程的安全底线这一天忙下来代码其实没改多少但我一点也不觉得进度慢。原因是这套 Git 基础操作搭起来之后后续跟 ClaudeCode 的协作方式发生了质的变化——以前它改完代码我只能凭感觉判断“好像还行”现在我能用git diff逐行审查、用分支隔离风险、用提交记录留痕每一步都清清楚楚。如果你也想复刻这套流程我建议严格遵循三个原则第一所有 Git 命令亲手敲拒绝复制粘贴也拒绝让 AI 代执行这个习惯能让你在最短时间内形成肌肉记忆第二30 分钟只学“提交、分支、远程、回滚”四个场景的命令不要贪多其他命令遇到具体问题再查第三也是最重要的一点永远记住 Git 只是工具它的核心价值是给改造工程装上“安全气囊”而不是给你增加额外的学习负担。我个人对第一天的复盘就一句话花半小时把 Git 练到“顺手”比花半天研究各种花式命令有用得多。后面改造老项目的过程还长ClaudeCode 能帮我把代码写出来但把代码安安稳稳放进仓库、随时能回退到任意版本这件事必须由我自己守住。你下一次改造老项目不妨也先从 30 分钟的手敲 Git 开始。
返回列表