提交很多时,用 git bisect 定位是哪次改坏的

47 次浏览3 条回复

在一长串提交里排查回归,不用挨个 checkout。git bisect 会用二分法不断缩小范围。

环境:Git 2.25+,先准备一个确认正常的提交,例如 abc1234:

git bisect start
git bisect bad HEAD
git bisect good abc1234

Git 会自动切到中间某个提交。跑完验证后,坏的标记 git bisect bad,正常的标记 git bisect good,重复几次就会指出最早的可疑提交。结束后记得回到原状态:

git bisect reset

如果项目有稳定的测试命令,还能用 git bisect run npm test 自动判断;测试命令需要以退出码 0 表示通过。

补一个挺实用的点:如果中间某个提交因为依赖或构建环境没法判断好坏,可以用 git bisect skip 跳过。自动脚本里返回退出码 125 也表示跳过当前提交,适合处理偶尔无法编译的历史节点。

bisect run 还有个容易踩的点:测试脚本最好自己做必要的清理,别让上一次构建产物影响下一次判断。比如 Node 项目可把复现命令包进单独的 shell 脚本,再让通过返回 0、确认复现返回 1;否则一次偶发失败就可能把范围带偏。

中途如果怀疑某次 good/bad 标错了,不一定要从头手敲。Git 2.25+ 可以先用 git bisect log 查看本轮判断;要重来时把日志保存下来,修正后再用 git bisect replay bisect.log 重放。排查步骤比较多时挺省事。