git bisect 是什么
git bisect 用二分法在一段历史里定位引入问题的提交:你标记一个已知正常的版本和一个已知有问题的版本,Git 每次检出中间那个提交请你验证,逐步把范围折半,直到锁定唯一一条提交。上千条提交大约十几次验证就能收敛。
手动模式与自动模式
默认是手动模式:每个中间提交由你实际验证后回答好或坏。如果问题可以用一条命令判定,还可以用 git bisect run 传入脚本,让流程自动跑完全程,适合回归测试能够覆盖的场景。两种模式都要记得最后 reset 退出。
基本信息
| 适用平台 | Linux / macOS / Windows(Git 2.x) |
|---|---|
| 语法 | git bisect start / good / bad / skip / reset |
| 流程 | 标记两端后逐步验证中点,直至收敛 |
| 自动模式 | git bisect run <命令> 自动判定 |
| 跳过 | bisect skip 用于无法验证的提交 |
| 退出 | git bisect reset 回到原分支 |
典型使用场景
- 定位回归:找出哪次提交引入了崩溃或行为变化
- 缩小范围:在发布分支与主干之间快速折半
- 自动排查:用 run 配合测试脚本全自动定位
- 处理不可用提交:某些提交编译不过时用 skip 跳过
- 复盘交接:用 bisect log 保存验证过程便于核对
常用示例
常用示例
git bisect start
git bisect bad # 当前版本有问题
git bisect good v1.4.0 # 这个标签是好的
git bisect good # 检出的版本验证正常
git bisect bad # 检出的版本验证异常
git bisect skip # 这个提交无法验证
git bisect run npm test # 用命令自动判定
git bisect reset # 结束并回到原分支常用子命令
| 子命令 | 作用 | 注意 |
|---|---|---|
| start | 进入二分流程 | 可带两端参数一次写清 |
| good / bad | 标记版本状态 | 必须如实按验证结果标记 |
| skip | 跳过无法验证的提交 | 会略微增加验证次数 |
| run | 用命令自动判定 | 命令退出码决定结果 |
| log | 输出判定记录 | 便于复盘与交接 |
| reset | 结束流程 | 必须执行,否则停在分离头指针 |
提交数量上千时,二分法大约只需十几次验证就能锁定嫌疑提交,是定位回归问题的常规手段。
结束时务必执行 git bisect reset,否则工作区会停在分离头指针位置,后续提交容易落到想不到的地方。