把 git bisect 直接等同于"提交历史上的二分查找",在只有一条直线历史的时候成立,但真实仓库大多带合并、带分支,git 选下一个待测点并不是按时间顺序取中间。它算的是 commit 图里每个候选点能切掉多少待查提交,挑那个让剩余嫌疑最小的点往下走。所以严格讲是"在 DAG 上做信息量最大的切分",不是朴素的中点。这点不影响日常使用,但理解之后,遇到某些提交被 skip、范围突然跳变的情况就不会发懵。
另一个更想提醒的,是你开头说的"偶发崩溃"和后面吹的 git bisect run 自动化,其实暗藏一点张力。二分能收敛的前提是每次验证结果确定——同一个提交,测一次是 bad,再测还该是 bad。可偶发崩溃偏偏测一次可能 good、再测又 bad。一旦你喂给 git bisect run 的是一条只跑单次的测试命令,它完全可能把本该判 bad 的提交误判成 good,于是朝错误的半边切下去,最后锁到的那次提交其实是冤枉的。
应对也不复杂:要么先把偶发变成必现,造一个能稳定触发的场景;要么让测试命令自带重复,比如连跑 N 次全过才算 good,有一次挂就判 bad。代价是单次验证变慢,但比起锁错提交再返工,这个时间花得值。
还有个小提醒,bisect 锁出来的那次提交,严格说是"让测试由绿转红的提交",未必是根因,它可能只是暴露了之前就埋着的一段烂代码。定位到之后最好再人工扫一眼上下文。
你那回十分钟锁到重构,按二三十个提交算大概 5 步上下,跟 log2(n) 的节奏吻合,算相当典型的案例了。