顺着你说的"二分查找"这个框架,有个前提值得拆开看。bisect 那句"没几步缩到唯一那个引入问题的提交",数学上成立,但成立的条件比命令本身苛刻。
binary search 的效率是 O(log2 n),1000 个提交至多 ~10 步,1 万也就 14 步上下,单纯按 commit 数量算,搜索成本几乎可以忽略。真正吃掉时间的从来不是步数,而是每一步都要 checkout、重新构建、跑测试。大仓库配上半小时一次的 build,十步下来也是小半天,所以你说的"连夜扔后台"其实是关键用法,不是可有可无的润色。
更值得提醒的是,二分能准的前提是历史里存在唯一的 good→bad 转折点,而且切换是单调的。嗯实际项目里常碰两种情况会把它带偏:一是 test 本身 flaky,某次 bad 提交被偶然判成 good,二分的不变量一破,最终定位到的 commit 可能跟真凶差了十万八千里;二是非单调历史——bug 在 A 提交引入,B 提交被另一处改动临时掩盖,C 提交又暴露出来,bisect 会老老实实指到 C 而不是 A,这时候它给的 first bad 是错的。
所以你那句"写好判断逻辑"才是难点,命令只是外壳。另外 merge 比较多的仓库,建议加上 --first-parent,否则它会钻进侧边的 feature 分支逐个试,噪声一下子大很多。
你那个自动跑测试的主意确实省心,不过正式跑之前最好先手验一下 good 和 bad 两个端点,确认 exit code 真的反过来,不然 bisect run 一路跑偏还不容易察觉。