你是否曾经在代码中发现一个错误,并且需要知道它最初是在什么时候引入的? 很可能,提交错误的人没有在他们的 Git 提交消息中声明它。 在某些情况下,它可能已经存在了数周、数月甚至数年,这意味着你需要搜索数百甚至数千个提交才能找到问题是在何时引入的。 这就是 git bisect
旨在解决的问题!
git bisect
命令是一个强大的工具,它可以快速检出一个已知良好状态和一个已知错误状态之间一半位置的提交,然后要求你将该提交标识为良好或错误。 然后它会重复此过程,直到你找到代码首次引入的确切提交。

(Martin Grandjean, CC BY-SA 4.0)
这个“数学魔法”工具通过利用对分的力量工作。 无论你需要经历多少步骤,通过查看中间点并决定它是提交列表的新顶部还是底部,你都可以在少数几个步骤中找到任何想要的提交。 即使你有 10,000 个提交要搜索,也最多只需要 13 个步骤即可找到第一个有问题的提交。
- 提交 1 错误 <> 提交 10,000 良好 => 提交 5,000 错误
- 提交 5,000 错误 <> 提交 10,000 良好 => 提交 7,500 良好
- 提交 5,000 错误 <> 提交 7,500 良好 => 提交 6,250 良好
- 提交 5,000 错误 <> 提交 6,250 良好 => 提交 5,625 错误
- 提交 5,625 错误 <> 提交 6,250 良好 => 提交 5,938 错误
- 提交 5,938 错误 <> 提交 6,250 良好 => 提交 6,094 良好
- 提交 5,938 错误 <> 提交 6,094 良好 => 提交 6,016 错误
- 提交 6,016 错误 <> 提交 6,094 良好 => 提交 6,055 良好
- 提交 6,016 错误 <> 提交 6,055 良好 => 提交 6,036 错误
- 提交 6036 错误 <> 提交 6055 良好 => 提交 6046 错误
- 提交 6,046 错误 <> 提交 6,055 良好 => 提交 6,050 错误
- 提交 6,050 错误 <> 提交 6,055 良好 => 提交 6,053 良好
- 提交 6,053 错误 <> 提交 6,055 良好 => 提交 6,054 良好
因此,在 10,000 个提交中,第一个错误的提交是提交编号 6,053。 使用 git bisect
,这最多需要几分钟。 我甚至无法想象如果逐个提交地爬网调查,这将花费多长时间。
使用 Git bisect
使用 git bisect
命令非常简单直接
$ git bisect start
$ git bisect bad # Git assumes you mean HEAD by default
$ git bisect good <ref> # specify a tag or commit ID for <ref>
Git 检出中间的提交,并等待你声明它是
$ git bisect good
## or
$ git bisect bad
然后,bisect 工具会重复检出好提交和坏提交之间一半位置的提交,直到你告诉它
$ git bisect reset
高级用户甚至可以编写脚本来确定良好和错误状态,以及在找到特定提交后要采取的任何补救措施。 你可能不会每天都使用 git bisect
命令,但是当你需要它时,它是一个救命稻草。
1 条评论