使用 Git bisect 命令定位首次引入错误的提交!
除了主要作为版本控制工具外,Git
也提供了几个命令来辅助你调试你的项目源码中的问题。 由于 Git
被设计成适用于几乎所有类型的内容,这些工具也相当通用,但它们往往可以在出现问题时帮助你找到 bug
或者原因。
Git 的 bisect 工具通过快速识别坏的提交,节省了时间和精力!
- [1] 文件标注
我们在开发过程中,肯定会遇到这样的问题,那就是:发现代码中有错误 bug
,但不知道这个错误是什么时候引入的!如果我们可以追踪代码到某一行,就可以通过 git blame
来查看每行最后一次修改的提交记录。
# 用 -L 选项还可以将标注的输出限制为该文件中的行
# 注意一下 ^1da 表示该文件自第一次提交后从未修改的那些行
$ git blame -L 69,82 Makefile
b8b0618cf6fab (Cheng Renquan 2009-05-26 16:03:07 +0800 69) ifeq ("$(origin V)", "command line")
b8b0618cf6fab (Cheng Renquan 2009-05-26 16:03:07 +0800 70) KBUILD_VERBOSE = $(V)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 71) endif
......
- [2] 二分查找
如果中间间隔数百或数千个提交,这就是非常头痛的一件事情了,而 git bisect
命令能够完美地解决这个问题。其实 git bisect
命令是一个强大的子命令,给定一个范围,一端是一个已知的好状态,另一端是一个已知的坏状态。它会自动地确认当前范围的中点,在这个中点上进行测试,然后要求你确定那次提交是一个 好提交(good commit
) 还是一个 坏提交 (bad commit
),然后它会重复 “二分查找” 的过程,直到你找到首次引入错误的那一次提交。
使用 git bisect 的流程如下
使用 git bisect
命令非常简单,使用 git bisect start
命令来进入 bisect
模式,并且该命令指定了一个检查范围(即一次好的一次坏的范围),之后持续重复上面的操作,进行测试告诉 Git
现在状态是否正常。
# 进入bisect模式
$ git bisect start
# start后面可以加上good和bad的提交点
# 不加good和bad的提交点将等待我们使用下面命令手动指定
$ git bisect start [rev bad] [rev good]
# 声明这次提交是一个好提交
# 如果不加,则默认标记当前的提交点
$ git bisect bad
# 声明这次提交是一个坏提交
# 如果不加,则默认标记当前的提交点
$ git bisect good v1.0
当你完成这些操作之后,你应该执行 git bisect reset
重置你的 HEAD
指针到最开始的位置, 否则你会停留在一个奇怪的状态。
# 重置你的状态
$ git bisect reset
# 跳过某一个待检查的提交点
$ git bisect skip
# 通过执行一个脚本来自动测试每个提交点代替手工测试
# 脚本的返回值定义: 0(Good) | 125(Skip) | 1~125/126/127(Failed)
$ git bisect run <cmd>
# 启动gitk来查看当前的bisect状态
$ git bisect visualsize
参考链接