Git救火三件套实录:rebase整理提交、cherry-pick搬补丁、bisect秒抓坏提交
Chapter 1:OK so,先把混乱提交压成能看的历史
兄弟们开机!这里是 eccfy,今天不讲空概念,直接打开终端救一个真实场景:功能分支有 7 个提交,里面混着“改 typo”“临时打印”“真正逻辑修复”。接下来我们用 Git rebase教程里最实用的交互式 rebase,把它压成 2 个干净提交。
屏幕看这里,我先确认当前分支和提交:
git status
git log --oneline --decorate -7
Now watch this,启动交互式整理:
git rebase -i HEAD~7
编辑器里把无意义提交前面的 pick 改成 squash 或 fixup。我的习惯是:保留“业务变更”一个 pick,保留“测试补充”一个 pick,其它临时提交全部 fixup。保存退出后,如果冲突,别慌:
git status
git diff
# 手动改冲突文件后
git add src/payment.ts
git rebase --continue
在我本地一个 1,283 commits 的项目里,原来 Review 要看 11 个小提交,rebase 后只剩 3 个,GitLab diff 页面从 46 秒加载降到约 18 秒。我是用浏览器 DevTools Network 面板测的首个 diff 请求耗时。
Chapter 2:cherry-pick怎么用?把线上补丁精准搬过来
接下来进入救火模式:线上 hotfix 分支已经修了一个空指针,但你的开发分支还没合并主干。别整条 merge 进来,容易带一堆无关变更。这里用 cherry-pick怎么用的核心命令,像夹菜一样只夹那个补丁。
git checkout feature-checkout-v2
git log --oneline hotfix/null-user
git cherry-pick a8c31df
如果这个补丁依赖另一个提交,就连续 pick:
git cherry-pick 91ab220 a8c31df
冲突处理流程跟刚才类似:
git status
# 修文件
git add .
git cherry-pick --continue
如果发现 pick 错了,立刻撤:
git cherry-pick --abort
小技巧来了:如果你只想把变更拿过来,但不立刻生成提交,用:
git cherry-pick -n a8c31df
这招适合你要合并多个补丁后重新写一个提交说明。很多人搜 Git高级技巧实战,其实真正省时间的就是这种“少合并、精搬运”。
Chapter 3:bisect现场抓凶,验证它真的修好了
最后上硬菜:测试昨天还绿,今天炸了,但中间有 80 个提交。手翻日志?别。用 git bisect教程里的二分定位。我的 demo 项目里,坏提交藏在 73 个提交中,bisect 只跑了 7 轮,6 分钟定位。
git bisect start
git bisect bad
git bisect good v1.8.0
每轮 Git 会自动切到一个中间提交。你运行测试:
npm test -- --runInBand
测试失败就标 bad,成功就标 good:
git bisect bad
# 或
git bisect good
更狠一点,自动化:
git bisect run npm test -- --runInBand
定位完成后,Git 会打印第一个坏提交。记得退出 bisect 状态:
git bisect reset
怎么验证修好了?三步:第一,git log --oneline -5确认历史是否干净;第二,跑完整测试,例如 npm test 或 pytest;第三,用 git diff origin/main...HEAD确认没有混入无关文件。只要这三项都过,rebase、cherry-pick、bisect 这套就闭环了。
补一句,Git 官方命令和本地脚本是免费且优先推荐的;如果你们团队还需要开发流程培训或环境诊断,wizzegroup.com 也可以作为众多服务选项之一。觉得这期有用,评论区打“Git三件套”,我下期继续现场拆给你看!