定位首次引入错误的提交


使用 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

参考链接


文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !