>> >> >>Indexer<< << << <<<<<< Idx >>>>>>
Matched: 0
bisect
M: 2025-12-31 - ljf12825

在代码库里某个时间点引入了bug,但不知道是哪一次提交导致的
只知道:

  • 过去某个提交时好的(没有bug)
  • 现在最新提交是坏的(有bug)

手动一条条提交去差太慢了。git bisect就是用二分查找的思想来快速缩小范围,最后精确定位是哪一次提交引入了问题

基本流程

假设在main分支上

  1. 启动bisect
git bisect start
  1. 告诉Git哪个是坏的提交(通常是当前的HEAD)
git bisect bad
  1. 告诉Git哪个是好的提交(比如记得某个旧版本能正常工作)
git bisect good <commit_hash>
  1. Git会自动checkout到两者之间的一个“中间提交”,让你测试
  • 测试这个版本有没有bug
  • 如果有bug,输入:
    git bisect bad
    
  • 如果没有bug,输入:
    git bisect good
    
  1. Git会继续缩小范围,直到最后定位到“第一个坏提交”
  2. 找到后,执行
git bisect reset

回到原来的分支状态

  • 如果在测试过程中搞错了,可以使用git bisect reset,然后git bisect start重新开始;或者使用git bisect skip跳过某个无法测试的提交

自动化测试

如果有一个脚本可以自动判断“好/坏”,git bisect可以全自动完成
例如有个test.h,返回0表示好,返回非零表示坏

git bisect start
git bisect bad
git bisect good <commit_hash>
git bisect run ./test.sh

它会自动在中间提交跑脚本,直到定位出问题提交

使用场景

  • 某个提交引入了崩溃、性能退化、错误行为
  • 不知道具体什么时候坏掉的,只能确定一段区间
  • 项目提交很多,人工查找非常低效