前阵子线上有个页面突然打不开。我盯着最近改动最多的模块看了两个小时,越看越觉得可疑,最后却发现问题来自一周前的一次依赖升级。
这种“凭经验锁定嫌疑人”的排查方式,我已经吃过不止一次亏。经验有用,但它也会把人带进熟悉的死胡同。后来我退回去,只确认两件事:哪个版本还正常,哪个版本已经出错。
让历史替我缩小范围
我先写了一条能稳定判断页面是否正常的命令,然后开始二分:
git bisect start
git bisect bad
git bisect good v2.3.0
Git 每次把代码切到中间版本,我只负责运行命令并标记 good 或 bad。原本横跨几十个提交的范围,很快缩到一个依赖更新上。那一刻有点尴尬,也有点痛快——机器没有跟着我的直觉跑偏。
如果判断过程能自动化,还可以直接执行:
git bisect run ./scripts/check-regression.sh
找到提交以后,我仍会把上下文再看一遍。有时那个提交只是碰巧揭开问题,真正的原因还藏在配置或数据迁移里。修复完成后,再从干净环境复现一次,最后记得退出:
git bisect reset
现在碰到回归,我会先忍住“肯定是那里”的冲动。把正常和异常的边界钉牢,再一步步缩小范围,通常比灵光一闪可靠得多。