start、bad、good 三步就能把范围缩到几次提交以内,比手动 checkout 快得多。项目能跑测试的话,直接 git bisect run 更省事。第一次用的时候我把 good 和 bad 写反了,白跑了十分钟。

流程是 git bisect start,再 git bisect bad 标当前出问题的提交,git bisect good 跟上某个没问题的提交。Git 会二分切到中间那次,你跑一下确认好坏,git bisect good 或 bad 继续,最后停在引入问题的那次提交上。

能跑测试就别手点。写个退出码正确的脚本交给 git bisect run,它自己二分完。我常用来查「上周还好好的,谁把构建搞挂了」这种回归。第一次我把 good 和 bad 标反,它一路往更早的版本跑,十分钟全白费,查到的还是个早就被弃用的提交。

有个细节容易错:good 要标「已知没问题的旧提交」,不是最新的。曾有个同事把刚拉的 main 当 good,二分一直停在最近,找了半天才发现方向反了。标完用 git bisect log 看一眼当前区间,确认没标反再继续,别像我第一次那样闷头跑到黑。

手动和自动两种写法:

git bisect start
git bisect bad HEAD
git bisect good v1.2.0
# 手动确认后:git bisect good | bad
# 或自动:git bisect run ./check.sh