Git bisect-二分法定位问题
Git bisect-二分法定位问题
背景
有时候发现了一个bug,但不能直接定位问题代码,甚至不知道什么时候引入的。比如我们项目近期发现整个网站的操作都变卡顿了,只知道一段时间前是好的,证明问题是最近上线的内容引入的。这就需要从近期的几百上千个commit中定位到问题的代码。这种时候git bisect就是一个很好的手段。
原理
Git bisect的原理很简单,就是利用二分法,用O(log(n))的复杂度快速定位到有问题的commit。
基本流程如下图
先确定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 log
git 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 bisect
git 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
福利
特意为大家准备了以下礼物进行抽奖:
那么如何获奖呢?
获奖分为以下3步
抽奖和领取奖品等其他事项:
The End
1、豆皮范儿后台回复「vis」,还可以获取更多可视化免费学习资料。
2、豆皮范儿后台回复「webgl」,还可以获取webgl免费学习资料。
3、豆皮范儿后台回复「算法」,还可以获取算法的学习资料。
4、豆皮范儿后台回复「招聘」,获取各种内推。
字节跳动数据平台前端团队,在公司内负责大数据相关产品的研发。我们在前端技术上保持着非常强的热情,除了数据产品相关的研发外,在数据可视化、海量数据处理优化、web excel、WebIDE、私有化部署、工程工具都方面都有很多的探索和积累,有兴趣可以与我们联系。
点个在看你最好看