你必定遇到过,一个好久没修改过的功能,莫名其妙的出现了问题?肉眼查代码、屡逻辑彻底找不到问题点?前两天还好好的功能,怎么这个今天就不行了?这两天改动了这么多代码,究竟是那一次改动引起的 Bug?git
这样非崩溃的 Bug,有时候想要排查出问题,并非一件容易的事情。我想,这个时候你会须要 git bisect !算法
git bisect 是 Git 提供的一种 二分法 的调试工具,它能够按照咱们选定的提交,进行二分分割,快速定位出出错的提交。来帮咱们缩小最小改动的代码,从而快速定位问题。设计模式
git bisect 其实很简单,主要是基于几个基本命令:工具
git bisect 涉及到的命令,很是的清晰简单,下面举个实际的例子,结合上面的解释,就更清晰了。学习
我本身生造出 6 个 commit,而后使用 git log
看看个人提交记录。测试
这里假设我正常开发的阶段,到 v6 提交的时候,忽然发现有个 Bug ,没法定位到问题,可是能明确的知道,在 v1 提交阶段,并无这个 Bug。spa
那么,在这样的状况下,v6 就是一个有问题的版本,而 v1 则是一个好的版本,咱们就能够借助 git bisect
来进行二分超找定位问题来自哪一个提交。debug
还记得刚才的命令吗?设计
咱们先用 git bisect start
标记开始 bisect debug ,而后使用 git bisect good
和 git bisect bad
分别标记出正确的和错误的提交。3d
每一个提交,都有一个针对这个提交惟一的 SHA-1 值,由于太长不方便输入和阅读,这里能够直接使用前几位做为简写。
当标记处正确的和错误的提交以后,git bisect
马上就能够帮咱们定位出中间提交 v3。
如今 HEAD 就已经指向了 v3 提交的代码了,这个可使用 git status
查看当前的状态。
因此咱们能够基于 v3 版本的代码,直接运行项目,测试看该提交是否有问题。
通过测试以后,发现 v3 的提交代码版本,并无复现 Bug,那咱们就能够缩小错误提交的范围,大概落在了 v4、v5、v6 之间。
此时,咱们只须要使用 git good
标记 v3 版本是正确的。
标记好 v3 为 good 以后,马上又会进行一次二分,这次标记的为中间提交 v5。
通过对 v5 提交的版本代码,进行测试以后发现,它是有问题的。咱们继续使用 git bisect bad
对它进行标记。
当 v5 有问题的时候,如今只中间一个 v4 版本,因此会马上指向 v4 提交。
咱们继续对 v4 版本的代码进行测试,发现 v4 版本也有问题,继续标记它为 bad 。
此时就很明确了,出错的提交就是 v4,而 Git 也直接帮咱们指出来出错的提交。
虽然这里定位到,出错的提交就是 v4 的问题,咱们只须要仔细阅读 v4 提交的代码,而后定位出问题代码,就达到了咱们的目的。可是咱们并不该该在 v4 提交上直接修改 Bug,咱们应该退出 bisect debug 状态,在最新的提交版本上进行修改,这里使用 git bisect reset
退出,再进行修改便可。
到这里,就是 git bisect
的完整工做流程。
对提交进行 good 和 bad 的标记,都是人为来进行的,不免有出错的状况。而提交比较少的时候,大不了就是 reset 以后,重头来过。
可是若是有几十个提交,再从头进行一次 bisect 就比较麻烦了。Git 考虑到这一点,已经为咱们配好了后悔药。
想要擦除以前的标记状态,就涉及到一个命令:
replay 须要制定一个回退的点,这个点是须要使用 git bisect log > log.txt
输出的 Log 文件, 咱们须要经过修改这个 Log 文件,来肯定回退的点。
举个例子,咱们使用 log 命令,输出一个 log.txt 文件。
能够看到,这个 log.txt 文件,记录了咱们刚才全部的操做。
在这个例子中,假如咱们的操做,对 v5 进行 bad 的这个标记错了,那么,咱们把这个操做之下的 Log 所有删除掉,而后执行 git bisect replay log.txt
。
这样就将回退到判断 v5 提交好坏的地方,从新进行标记。
在修改 Log.txt 文件的时候,最好只执行删除操做,不要对其中的顺序有所修改,毕竟咱们只是想要一个回滚的动做,并非要改动咱们以前的某些操做。
今天在 承香墨影公众号的后台,回复『 成长』。我会送你一些我整理的学习资料,包含:Android反编译、算法、设计模式、虚拟机、Linux、Kotlin、Python、爬虫、Web项目源码。
推荐阅读: