掌握 git bisect 的二分查找算法,用最少的步骤从几百个提交中精确定位引入 Bug 的那个提交。
Bisect — 用二分法从几百个提交中找到罪魁祸首 线上出了 Bug,你知道上周还是好的,但中间有 200 个提交,逐个排查?太慢了。
git bisect 用二分查找算法 ,只需要 log₂(200) ≈ 8 次就能定位到引入问题的那个提交。
一、 什么是 Bisect? Bisect 的原理很简单:
1 2 3 4 5 6 7 已知:提交 A 是好的,提交 Z 是有 Bug 的 第 1 步:跳到中间提交 M,测试 → 有 Bug → Bug 在 A~M 之间 第 2 步:跳到 A~M 的中间 H,测试 → 没 Bug → Bug 在 H~M 之间 第 3 步:跳到 H~M 的中间 K,测试 → 有 Bug → Bug 在 H~K 之间 ... 最终:定位到引入 Bug 的提交
提交数量 逐个排查 bisect 100 个 最多 100 次 最多 7 次 500 个 最多 500 次 最多 9 次 1000 个 最多 1000 次 最多 10 次
二、 基本用法 手动二分查找 1 2 3 4 5 6 7 8 9 10 11 12 git bisect start git bisect bad git bisect good abc1234
测试并标记 Git 跳到中间提交后,你测试一下,告诉它结果:
1 2 3 4 5 git bisect bad git bisect good
Git 会继续跳到下一个中间提交,重复这个过程,直到找到第一个”坏”的提交:
1 2 3 4 5 6 # abc1234 is the first bad commit # commit abc1234 # Author: John Doe # Date: Mon Jun 1 10:00:00 2026 # # feat: 重构用户模块
结束 bisect 三、 完整操作流程 场景:首页崩溃了,上周还是好的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 git bisect start git bisect bad git log --oneline git bisect good x9y8z7w git bisect bad git bisect good git show abc1234 git bisect reset
四、 自动化 bisect 如果 Bug 可以通过命令检测(如测试失败),可以让 bisect 自动运行,完全不需要手动测试。
用测试脚本自动判定 1 2 3 git bisect start HEAD abc1234 -- git bisect run npm test
执行过程:
1 2 3 4 5 6 7 8 Bisecting: 100 revisions left running npm test ...测试通过... → 自动标记 good Bisecting: 50 revisions left running npm test ...测试失败... → 自动标记 bad ... abc1234 is the first bad commit
用自定义脚本 1 2 3 4 5 6 7 8 9 10 11 12 cat > check_bug.sh << 'EOF' grep -q "processPayment" src/payment.js EOFchmod +x check_bug.sh git bisect start HEAD abc1234 git bisect run ./check_bug.sh
脚本返回值规则 返回值 含义 0当前版本是”好的” 1-124 或 126-127当前版本是”坏的” 125当前版本无法测试(跳过) >127中止 bisect
自动化 bisect 的优势 :
完全不需要人工参与 判定结果客观准确 适合回归测试(之前通过的测试突然失败了) 五、 常用选项 用 Tag 标记好坏 1 2 3 4 git bisect start git bisect bad HEAD git bisect good v1.2.0 ← v1.2.0 是好的,当前是坏的
跳过无法测试的版本 有时候中间某个提交编译都过不了,没法测试:
查看 bisect 日志 重放 bisect 日志 1 2 3 4 5 git bisect log > bisect.log git bisect replay bisect.log
六、 注意事项 bisect 期间的注意事项 :
bisect 过程中不要手动切换分支 ,Git 会自动管理 HEAD 如果需要修改代码来测试,先 git stash,测试完再 git stash pop 一定记得 git bisect reset 回到正常状态 “好”和”坏”的提交之间必须是连续的线性历史 ,中间不能有 merge 分叉 什么时候适合用 bisect? 1 2 3 4 5 6 7 8 9 10 11 提交太多,手动排查不现实? └── bisect ✅ Bug 可以通过命令自动检测? └── bisect run ✅ (全自动) Bug 只表现在视觉上(UI 问题)? └── bisect 手动模式(需要人眼看) 需要跨分支定位问题? └── 不适合 bisect(bisect 在同一分支上工作)
总结:Bisect 速查卡 1 2 3 4 5 6 7 8 9 10 11 12 13 ┌──────────────────────────────────────────────────────────┐ │ Git Bisect 速查 │ ├────────────────┬─────────────────────────────────────────┤ │ 启动 │ git bisect start │ │ 标记坏的 │ git bisect bad [commit] │ │ 标记好的 │ git bisect good [commit] │ │ 跳过无法测试的 │ git bisect skip │ │ 结束并恢复 │ git bisect reset │ ├────────────────┼─────────────────────────────────────────┤ │ 自动 bisect │ git bisect run <command> │ │ 查看 bisect 日志 │ git bisect log │ │ 重放日志 │ git bisect replay <file> │ └────────────────┴─────────────────────────────────────────┘