git bisect
是一个用来定位引入 bug 的提交的命令。通过二分查找的方式,它能帮助你找到哪一个提交导致了问题,特别是在提交历史较长的情况下非常有用。
使用步骤
-
初始化 bisect:
首先,使用git bisect start
来开始查找。 -
标记已知的好提交和坏提交:
- 使用
git bisect good <commit>
来标记一个已知的好提交(没有问题)。 - 使用
git bisect bad <commit>
来标记当前的坏提交(有问题)。
例如,假设你知道在
commit A
之前代码是好的,在commit B
后代码是坏的,命令如下:git bisect start git bisect good <commit A> git bisect bad <commit B>
- 使用
-
Git 会自动选择一个中间的提交:
Git 会基于你给出的“好”提交和“坏”提交,自动选择一个中间的提交来检查是否存在 bug。 -
测试并标记每个提交:
- 在每次检查完 Git 选择的提交后,你需要测试代码,看看它是否有 bug。
- 如果提交是好的,使用
git bisect good
。 - 如果提交是坏的,使用
git bisect bad
。
-
重复直到找到问题提交:
Git 会继续二分查找,每次选择中间的提交进行检查,直到找到导致问题的提交。 -
结束 bisect:
一旦找到了坏提交,使用以下命令结束 bisect:git bisect reset
这会将你的 HEAD 恢复到 bisect 开始前的状态。
示例
假设你发现从某个提交开始出现了 bug,但不确定是哪次提交引入的,流程可能如下:
- 假设最初的 bug 出现时,当前版本为
bad_commit
,之前的版本是好的,可以确定。 - 假设从
commit A
到bad_commit
之间引入了 bug,运行:git bisect start git bisect good <commit A> # 标记为好的提交 git bisect bad <bad_commit> # 标记为坏的提交
- Git 会选择一个中间的提交进行测试,测试后,继续使用
git bisect good
或git bisect bad
来标记该提交。 - 重复这个过程,直到定位到导致 bug 的提交。
这个方法特别适用于排查问题,特别是当你不确定是哪个提交引入了 bug 时。