Git Bisect 快速上手
假设你刚接手一个项目,这时线上出现了一个 bug,因为对业务不熟悉加上老板施压,导致 bug 定位过程异常艰难,开始焦头烂额。
聪明的你转念一想:既然无法准确定位 bug,那不如先找到是哪个提交引入的 bug,这样再去定位 bug 就简单很多了。
于是你确认了bug 存在的 commit 区间,使用二分查找来找 bug commit
,假设 bug 存在的 commit 区间是(3 ~ 10),你开始了如下过程:
你确定了 3 是没有 bug ,10 有 bug,于是使用二分查找,找到 6,判断 6 有 bug。继续缩小范围,最终找到了第一次出现 bug 的 commit 是 4,就能确定 bug 是 4 引入的。
这个手动查找的过程比较繁琐,而恰好 git 是有命令来支持这个查找行为的,这个命令就是 git bisect
。
bisect 命令参数使用
将上诉过程使用基本 Git 命令,来表示。
- 找到引入 bug 的 commit 范围
- 二分查找,并切换到分支
- 运行代码,判断是否有 bug 是否存在
- 重复 2、3,最终确认第一次引入 bug 的 commit
现在使用 Git Bisect
来实现,步骤和上面都差不多,只不过省去了很多人为的动作。
- 告诉 Git 需要开启
bisect
模式
1 |
|
- 告诉 Git 需要查找的 commit 范围,需要指定一个 good (正常代码) 和一个 bad(存在 bug 的提交)
1 |
|
- 步骤 2 执行结束后,Git 会进行二分查找,并自动切换到对应分支。只需要再验证分支是否还存在 bug,存在标记为 bad,反之 good
1 |
|
- 只需重复 3 的过程,最后 bisect 会帮我们找到第一个出现 bug 的 commit。
In Action
这个项目有多个版本,从 v1.0 到 v9.1,其中我们能确定 v1.0 是没有 bug,v9.1 是有 bug 的,bug 的表现形式是一条输出语句I have a bug!
,代码如下:
1 |
|
使用 git bisect
查找过程
1 |
|
执行 git bisect reset
后,bisect 过程即结束。
使用脚本
bisect 支持使用脚本,使用脚本的目的是帮 git 来判断 bug。git 执行脚本,根据脚本的执行结果,自动帮我们标记 good 或 bad。
上面的例子,可以根据输出结果包含 bug
字样来判断 bug,对应的 shell 脚本命令如下:
1 |
|
这个脚本执行 java Product
,判断输出结果是否包含 bug
字样,包含则 exit code 为 1,反之为 0;
有了这个判断脚本之后,上面的查找流程可以大大简化
1 |
|
至此,bisect 查找过程结束。
结论
git bisect
在业务开发方面使用的比较少,但是在开源项目中,使用相对比较频繁。
对于开源项目,可以使用 git bisect
帮助开发者定位 bug,贡献 issues。
对于棘手的 bug 定位,git bisect
为我们提供了另外一种解决思路。