使用二分法(bisect)定位引入的bug
情景模拟准备
仓库中有一个record.txt文本文件,如果有一行的文本为"有bug"表示存在bug。已知其中一个正常提交的commit id是902c829f42b14d547330519993674e7f909a73a4,引入bug提交的commit id是98068739138d5785f2186d37efdfadfe9b5ebf1d。
名词定义
bad:存在bug的提交
good:无bug的提交
做法1
- 开始进入二分法定位bug时需要指定一个已知存在bug(bad)与无bug(good)的提交
- 初始化并进入二分操作
1
2# start后参数为空表示已知的bad和good提交在后续标记
git bisect start - 标记一个good的提交
1
git bisect good 902c829f42b14d547330519993674e7f909a73a4
- 标记当前commit存在bug,这时会采用二分法跳到good与bad中间的commit
1
git bisect bad
- 经过上面标记完成后,二分法定位bug正式开始.到了下一个commit,需要检查该提交是否存在bug,然后完成标记或者跳过该提交
1
2
3
4
5
6
7
8# 如果当前commit存在bug则标记为bad
git bisect bad
# 如果当前commit无bug则标记为good
git bisect good
# 跳过该提交则执行skip
git bisect skip - 执行上面操作之后都会定位到下一个commit,重复操作直到定位到bug,git会给出首次引入bug的commit的提示的
- bug定位完成后退出二分查找#### 做法2
1
git bisect reset
- 在初始化时标记一个bad提交和一个good提交
1
2# git bisect start <bad> <good>
git bisect start head 902c829f42b14d547330519993674e7f909a73a4 - 剩下的做法与做法1相同
做法3(使用图形化)
- 初始化
1
git bisect start head 902c829f42b14d547330519993674e7f909a73a4
- 进入图形化操作
1
git bisect visualize
做法4(使用脚本让git自动完成定位)
- 编写一个可以检查bug的脚本,脚本返回0表示无bug,返回其它任意值表示存在bug,例如:
1
2
3# file: check
#!/bin/sh
! grep -q "有bug" record.txt - 开始执行二分法定位bug
1
2git bisect start head 902c829f42b14d547330519993674e7f909a73a4
git bisect run ./check
查看日志
1 | git bisect log |