Git bisect 怎么自动运行测试定位引入回归的提交
如果一个功能在某个版本还正常,升级后却回归,逐个提交手工测试很容易把“无法构建”误判成“功能坏了”。更稳的做法是先给出一个已知正常的 good 提交和一个已知异常的 bad 提交,再让 git bisect run 自动执行回归脚本。脚本用退出码告诉 Git 当前提交属于 good、bad,还是暂时不能测试。
真正的关键是让测试脚本只表达结论:退出码 0 表示正常,1 到 124 表示回归,125 表示当前提交不可测试。定位结束后执行
git bisect reset,工作区才会回到开始二分前的状态。
- 先固定 good/bad 边界,不要拿两个都不稳定的提交开始。
- 把编译、准备数据和断言封装进一个可重复脚本,再交给
git bisect run。 - 依赖缺失或构建失败用 125 跳过,不要把环境问题标记成 bad。
步骤一:先固定 good 和 bad 边界
打开 Git 工作台,进入菜单路径 Repository → Bisect → Start。在 Good commit 填写最后一个确认正常的提交,在 Bad commit 填写当前已经出现回归的提交,点击 Start bisect。如果使用命令行,等价操作如下:
# 把异常提交和正常提交交给 Git,建立二分会话 git bisect start HEAD stable-2026-01 # 也可以分开标记,便于确认每个边界的含义 git bisect bad HEAD git bisect good stable-2026-01
Git 会切换到中间提交,并提示大约还剩多少次测试。这里的 good 不一定是某个版本标签,也可以是你已经通过回归测试的提交;重要的是它确实位于 bad 提交之前,并且目标问题在这两个边界之间发生。

图中的提交引用只是示例。实际操作时不要直接复制示例值,先用 git log --oneline 或仓库历史面板确认边界。
步骤二:把回归测试交给 git bisect run
进入 Repository → Bisect → Run Test,在 Test command 中填写 ./scripts/check-regression.sh。这个脚本必须能在每个被检出的提交上独立运行:先准备依赖和测试数据,再执行目标测试,最后把测试结果转换成退出码。
#!/usr/bin/env bash set -u # 构建失败通常是该提交无法测试,不要直接当成回归 if ! go test ./internal/regression; then # 这里的 125 会让 git bisect run 跳过当前提交 exit 125 fi # 测试通过返回 0,断言失败返回 1 if go test ./internal/regression -run TestLegacyResponse; then exit 0 else exit 1 fi
保存脚本并赋予执行权限后,在仓库根目录运行:
# 确保脚本可执行,再让 Git 自动循环测试 chmod +x ./scripts/check-regression.sh git bisect run ./scripts/check-regression.sh
退出码映射要保持稳定:0 表示 good,1–124 或 126–127 表示 bad,125 专门表示无法测试;脚本返回其他值时,二分会中止。脚本不要输出带颜色的复杂文本来代替退出码,日志可以帮助排查,但不能代替结论。

步骤三:遇到无法构建的提交就跳过
在 Repository → Bisect → Skip Current 中可以手动跳过当前提交,命令行对应 git bisect skip。自动脚本遇到缺失依赖、生成文件缺失或与目标回归无关的构建错误时,应返回 125,让 Git 自动记录该提交不可测试。
# 手工跳过当前检出的提交 git bisect skip # 查看当前已经标记过的二分记录 git bisect log # 查看仍待测试的候选提交 git bisect visualize
跳过会缩小可用信息量。如果首个坏提交恰好挨着被跳过的提交,Git 可能只能告诉你一个范围,而不是唯一的提交。因此,脚本应该尽量把“环境准备失败”和“功能断言失败”区分开,并在日志中保存失败原因。
步骤四:记录结果并安全回到原分支
二分结束后,Git 会报告首个坏提交候选。先在 Repository → Bisect → Result 中复制提交号,再查看该提交的改动和测试日志,确认它确实改变了目标行为。不要在 bisect 状态下继续开发或直接提交修复。
# 查看二分过程,确认 good、bad 与 skip 记录 git bisect log # 查看 Git 认为的首个坏提交详情 git show --stat bisect/bad # 清理二分状态,默认回到启动前的 HEAD git bisect reset
如果想停留在当前定位到的提交,可以使用 git bisect reset HEAD;如果需要回到首个坏提交再检查,也可以使用 git bisect reset bisect/bad。收尾后再运行 git status,确认没有残留的 bisect 状态或测试脚本临时改动。
常见问题与边界
测试脚本需要输出 good 或 bad 吗?
不需要。git bisect run 主要读取退出码,标准输出只用于辅助诊断;把结论固定为退出码,脚本更容易在 CI 或不同提交之间重复运行。
为什么 125 不能表示测试失败?
Git 把 125 约定为“当前版本无法测试”,因此会执行跳过逻辑。真正的回归断言失败应使用 1 到 124,避免把坏提交从搜索空间中误删。
收尾检查
一轮可靠的自动二分应该满足三点:good/bad 边界可解释,脚本在每个提交上只用退出码给出结论,无法测试的提交明确返回 125。定位后执行 git bisect reset,再回到正常分支流程,最后用一次独立回归测试验证结论。
Go Cmd 输出管道忘记关闭时怎么避免子进程卡住
- 上一篇
- Go Cmd 输出管道忘记关闭时怎么避免子进程卡住
- 下一篇
- Go HTTP handler panic 后如何区分恢复和连接中断
-
- 文章 · 软件教程 | 1小时前 | docker compose · 软件教程 · Docker Compose env-file Compose 配置
- Docker Compose 怎么切换 env-file 而不改 compose.yaml
- 213浏览 收藏
-
- 文章 · 软件教程 | 2小时前 | docker compose · 软件教程 · Docker Compose Profiles env-file
- Docker Compose 怎么用 profile 只启动调试服务
- 259浏览 收藏
-
- 文章 · 软件教程 | 3小时前 |
- GitHub Desktop 如何在分支间比较提交而不切换当前分支
- 480浏览 收藏
-
- 文章 · 软件教程 | 5小时前 | git · 差异对比 · GitHub Desktop · 提交历史 ·
- GitHub Desktop 怎么查看某次提交前后的行级差异
- 488浏览 收藏
-
- 文章 · 软件教程 | 6小时前 | 调试 · vs code · 软件教程 · VS Code 断点调试 条件断点 Run and Debug
- VS Code 条件断点怎么只停在满足字段值的请求上
- 126浏览 收藏
-
- 文章 · 软件教程 | 7小时前 |
- VS Code launch.json 怎么为不同环境配置调试参数
- 108浏览 收藏
-
- 文章 · 软件教程 | 8小时前 | jsonc · vs code · 软件教程 · settings.json ·
- VS Code settings.json 报错时怎么定位缺失逗号
- 462浏览 收藏
-
- 文章 · 软件教程 | 9小时前 | vs code · 软件教程 · VS Code settings.json 保存时格式化 工作区设置
- VS Code 怎么只给当前项目启用保存时格式化
- 143浏览 收藏
-
- 文章 · 软件教程 | 12小时前 |
- GitHub Desktop 暂存部分修改后怎么查看未暂存差异
- 222浏览 收藏
-
- 文章 · 软件教程 | 15小时前 | junit · 软件教程 · IntelliJ IDEA · junit Intellij IDEA pattern 测试方法
- IntelliJ IDEA 怎么只运行当前测试类的一组方法
- 364浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 19次使用
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 177次使用
-
- C-Eval
- 深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
- 111次使用
-
- AI Prompt Library
- 探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
- 38次使用
-
- Generrated
- Generrated汇集9300+张DALL·E生成图像及对应提示词,支持查看完整图集、对比DALL·E 2与3版本差异,是AI绘图新手学习Prompt设计与获取创作灵感的实用工具。
- 18次使用
-
- Go HTTP 客户端超时实战:别让默认 Client 拖垮 goroutine
- 2026-06-04 205浏览
-
- Go HTTP 响应体忘记关闭:连接占用与 Goroutine 增长的排查修复
- 2026-07-13 201浏览
-
- Go JSON 严格解码上线后请求变 400:DisallowUnknownFields 的兼容性故障复盘
- 2026-07-26 174浏览
-
- Go iter.Pull 怎么安全消费迭代器:停止时机、资源释放与 goroutine 泄漏排查
- 2026-08-26 423浏览
-
- Go net/http 的 ConnState 如何识别连接泄漏:状态转移、计数采样与回收验证
- 2026-08-27 311浏览

