vlambda博客
学习文章列表

Git bisect-二分法定位问题



Git bisect-二分法定位问题

背景

有时候发现了一个bug,但不能直接定位问题代码,甚至不知道什么时候引入的。比如我们项目近期发现整个网站的操作都变卡顿了,只知道一段时间前是好的,证明问题是最近上线的内容引入的。这就需要从近期的几百上千个commit中定位到问题的代码。这种时候git bisect就是一个很好的手段。

原理

Git bisect的原理很简单,就是利用二分法,用O(log(n))的复杂度快速定位到有问题的commit。

基本流程如下图

Git bisect-二分法定位问题

先确定Broken和Stable的commit,切换到中间的commit,再检查当前commit是broken还是stable,然后继续二分地缩小返回。理论上1000个commit也只需经过10步就能定位问题了。

实际操作步骤

1.初始化和指定有问题的commit(bad)和没有问题的commit(good)

 # 初始化 git bisect start # 表示当前commit是有问题的 git bisect bad # 表示some_branch_commit是指没有问题的分支或者commit git bisect good some_branch_commit

当指定了至少一个good和bad的commit后,git bisect会选择二者中间的commit,checkout过去,并显示当前的状态,类似于:

Bisecting: 675 revisions left to test after this (roughly 10 steps)

2.重新运行编译当前代码,确认当前的commit是否有问题。如果使用了热更新,前端页面的话只要刷新页面即可。使用git bisect bad或git bisect good给当前commit打标记。3.重复第二步,直到只剩下一个bad的commit,也即第一个bad的commit,结果例如 d00119a65b642cd929407acb94cb07722b9af2e9 is the first bad commit4.完成了问题commit的定位,通过git bisect reset退出bisect操作,并且回到最开始start对应的commit。git bisect reset

这样就是一个完整的使用git bisect定位问题commit的流程了。git bisect还提供了更多的用法,以下是比较有用的几个

Commit log的形式可视化展示当前bisect的进度

git bisect visualize

显示已经做过good/bad的过程

$ git bisect loggit bisect start# bad: [2654ff25d10279de0ae00cc32819406339d74659] Merge branch ...git bisect bad 2654ff25d10279de0ae00cc32819406339d74659# good: [fc836fbf6e8f1087c53760b2ca81c242875ba20e] Merge branch ...git bisect good fc836fbf6e8f1087c53760b2ca81c242875ba20e# good: [01278e32452683ad5e690b38a17b11f415b80989] fix: ...git bisect good 01278e32452683ad5e690b38a17b11f415b80989# good: [0c52aa307cbefb9d94ebe95a79e2140df6d9c1ad] fix: ...git bisect good 0c52aa307cbefb9d94ebe95a79e2140df6d9c1ad# bad: [d00119a65b642cd929407acb94cb07703b9af2e9] update: ...

重跑bisect流程,有时候可能判断good/bad有误,可以通过replay的方式快速重来

git bisect log > log-file# 编辑log-file,比如删掉最后一次git bisectgit bisect replay log-file

跳过当前commit,当无法判断当前commit是good/bad的时候,可以skip掉,但继续bisect过程

git bisect skip

参考链接

git-bisect文档:https://git-scm.com/docs/git-bisect二分查找算法 https://en.wikipedia.org/wiki/Binary_search_algorithm


福利

特意为大家准备了以下礼物进行抽奖:

Git bisect-二分法定位问题

那么如何获奖呢?

获奖分为以下3步

抽奖和领取奖品等其他事项:

The     End

1、豆皮范儿后台回复「vis」,还可以获取更多可视化免费学习资料。

2、豆皮范儿后台回复「webgl」,还可以获取webgl免费学习资料。

3、豆皮范儿后台回复「算法」,还可以获取算法的学习资料。

4、豆皮范儿后台回复「招聘」,获取各种内推。

Git bisect-二分法定位问题

字节跳动数据平台前端团队,在公司内负责大数据相关产品的研发。我们在前端技术上保持着非常强的热情,除了数据产品相关的研发外,在数据可视化、海量数据处理优化、web excel、WebIDE、私有化部署、工程工具都方面都有很多的探索和积累,有兴趣可以与我们联系。

Git bisect-二分法定位问题
豆皮范儿
小豆皮的前端范儿
82篇原创内容
Official Account






点个在看你最好看