git:二分查找定位引入BUG的提交
git就是这么一个神奇的工具,即使在学习了很多使用技巧后,依然会在某个时刻发现一个awesome的新功能。
普通用户对基础软件/工具很容易产生一个误区,认为基础软件完成了其核心任务后,它剩下的任务就是bugfix了。以git为例,普通用户在了解它是一个版本管理工具后,就认为它主要的开发任务就完成了。确实,正常情况下除非你是git的开发人员,确实没有必要一直关心git的开发过程。但是这并不代表它的开发活动就很沉寂了,正相反,一个伟大的项目必要需要活跃的持续开发才能持续成为所在领域的旗舰级产品。今天要介绍的一个git功能,就是这样一个让你选择它作为首选版本管理工具的功能之一。
git-bisect - Find by binary search the change that introduced a bug
git bisect
可以通过二分查找的方式来定位引入BUG的提交,当你了解到这样一个元知识的时候,最好的教程莫过于官方的help文件,即使用git bisect --help
来了解该功能。
接下来,本文会简要介绍两种常见用法。
人工单步定位
# git bisect start // 开始二分查找
# git bisect good xxx // 将xxx提交标记为good样本,即已知的未包含待定位BUG的早期版本。xxx可以是tag或者commit编号
# git bisect bad yyy // 将yyy提交标记为bad样本,即已知的包含待定位BUG的版本
反复执行上述过程,就不难定义到从哪一个提交开始,开始引入了该BUG。
但是上述过程难免枯燥,而且People make mistakes
。所以如果判断BUG是否存在可以用一个脚本来分析,那么这个定位BUG的过程也能够自动来进行。
自动二分定位
假设判断当前待定位BUG存在的方式是make
命令是否执行成功,那么就可以用以下命令来进行自动二分定位
# git bisect start HEAD v1.2 -- // 当前HEAD为bad标记,v1.2为good标记
# git bisect run make // 指定自动二分定位,判断方式:make是否指定成功
# git bisect reset // 结果bisect过程
git bisect run [cmd]
依靠cmd的返回值来判断当前commit对应的是bad commit还是good commit。简单来讲就是返回0表示good,非零表示bad。当然非零具体值也有不同的含义,具体还是仔细看看git bisect --help
比较靠谱。