git bisect:让你闭眼都能定位疑难 bug的利器
摘要:git bisect命令使用二分搜索算法来查找提交历史中的哪一次提交引入了错误。它几乎能让你闭着眼睛快速定位任何源码导致的问题,非常实用。
本文分享自华为云社区《利用好 git bisect 这把利器,帮助你快速定位疑难 bug》,作者: DevUI。
使用git bisect二分法定位问题的基本步骤:
- git bisect start [最近的出错的commitid] [较远的正确的commitid]
- 测试相应的功能
- git bisect good 标记正确
- 直到出现问题则 标记错误 git bisect bad
- 提示的commitid就是导致问题的那次提交
问题描述
我们以Vue DevUI组件库的一个bug举例子
5d14c34b这一次commit,执行yarn build报错,报错信息如下:
✓ building client + server bundles...
rendering pages...
build error:
ReferenceError: document is not defined
我可以确定的是上一次发版本(d577ce4)是可以build成功的。
git bisect 简介
git bisect命令使用二分搜索算法来查找提交历史中的哪一次提交引入了错误。它几乎能让你闭着眼睛快速定位任何源码导致的问题,非常实用。
你只需要告诉这个命令一个包含该bug的坏commit ID和一个引入该bug之前的好commit ID,这个命令会用二分法在这两个提交之间选择一个中间的commit ID,切换到那个commit ID的代码,然后询问你这是好的commit ID还是坏的commit ID,你告诉它是好还是坏,然后它会不断缩小范围,直到找到那次引入bug的凶手commit ID。
这样我们就只需要分析那一次提交的代码,就能快速定位和解决这个bug(具体定位的时间取决于该次提交的代码量和你的经验),所以我们提交代码时一定要养成小批量提交的习惯,每次只提交一个小的独立功能,这样出问题了,定位起来会非常快。
接下来我就以Vue DevUI之前出现过的一个bug为例,详细介绍下如何使用git bisect这把利器。
定位过程
git bisect start 5d14c34b d577ce4
or
git bisect start HEAD d577ce4
其中5d14c34b这次是最近出现的有bug的提交,d577ce4这个是上一次发版本没问题的提交。
执行完启动bisect之后,马上就切到中间的一次提交啦,以下是打印结果:
kagol:vue-devui kagol$ git bisect start 5d14c34b d577ce4
Bisecting: 11 revisions left to test after this (roughly 4 steps)
[1cfafaaa58e03850e0c9ddc4246ae40d18b03d71] fix: read-tip icon样式泄露 (#54)
可以看到已经切到以下提交:
[1cfafaaa] fix: read-tip icon样式泄露 (#54)
执行命令:
yarn build
构建成功,所以标记下good:
git bisect good
kagol:vue-devui kagol$ git bisect good
Bisecting: 5 revisions left to test after this (roughly 3 steps)
[c0c4cc1a25c5c6967b85100ee8ac636d90eff4b0] feat(drawer): add service model (#27)
标记万good,马上又通过二分法,切到了一次新的提交:
[c0c4cc1a] feat(drawer): add service model (#27)
再次执行build命令:
yarn build
build失败了,出现了我们最早遇到的报错:
✓ building client + server bundles...
rendering pages...
build error:
ReferenceError: document is not defined
标记下bad,再一次切到中间的提交:
kagol:vue-devui kagol$ git bisect bad
Bisecting: 2 revisions left to test after this (roughly 2 steps)
[86634fd8efd2b808811835e7cb7ca80bc2904795] feat: add scss preprocessor in docs && fix:(Toast) single lifeMode bug in Toast
以此类推,不断地验证、标记、验证、标记…最终会提示我们那一次提交导致了这次的bug,提交者、提交时间、提交message等信息。
kagol:vue-devui kagol$ git bisect good
c0c4cc1a25c5c6967b85100ee8ac636d90eff4b0 is the first bad commit
commit c0c4cc1a25c5c6967b85100ee8ac636d90eff4b0
Author: nif <lnzhangsong@163.com>
Date: Sun Dec 26 21:37:05 2021 +0800 feat(drawer): add service model (#27) * feat(drawer): add service model * docs(drawer): add service model demo * fix(drawer): remove 'console.log()' packages/devui-vue/devui/drawer/index.ts | 7 +++--
.../devui-vue/devui/drawer/src/drawer-service.ts | 33 ++++++++++++++++++++++
packages/devui-vue/devui/drawer/src/drawer.tsx | 3 ++
packages/devui-vue/docs/components/drawer/index.md | 29 +++++++++++++++++++
4 files changed, 69 insertions(+), 3 deletions(-)
create mode 100644 packages/devui-vue/devui/drawer/src/drawer-service.ts
最终定位到出问题的commit:
c0c4cc1a is the first bad commit
https://github.com/DevCloudFE/vue-devui/commit/c0c4cc1a25c5c6967b85100ee8ac636d90eff4b0
整个定位过程几乎是机械的操作,不需要了解项目源码,不需要了解最近谁提交了什么内容,只需要无脑地:验证、标记、验证、标记,最后git会告诉我们那一次提交出错。
这么香的工具,赶紧来试试吧!
问题分析
直到哪个commit出问题了,定位起来范围就小了很多。
如果平时提交代码又能很好地遵循小颗粒提交的话,bug呼之欲出。
这里必须表扬下我们DevUI的田主(Contributor)们,他们都养成了小颗粒提交的习惯,这次导致bug的提交c0c4cc1a,只提交了4个文件,涉及70多行代码。

我们在其中搜索下document关键字,发现了两处,都在drawer-service.ts整个文件中:
一处是12行的:
static $body: HTMLElement | null = document.body
另一处是17行的:
this.$div = document.createElement('div')

最终发现罪魁祸首就是12行的代码!
破案!
此处@lnzhangsong我们的田主,有空麻烦修下这个bug。
git bisect:让你闭眼都能定位疑难 bug的利器的更多相关文章
- Git 二分调试法,火速定位疑难Bug!
你一定遇到过,一个很久没修改过的功能,莫名其妙的出现了问题?肉眼查代码.屡逻辑完全找不到问题点?前两天还好好的功能,怎么这个今天就不行了?这两天改动了这么多代码,到底是那一次改动引发的 Bug? 这样 ...
- 让 Git Bisect 帮助你
让 Git Bisect 帮助你 英文原文:Letting Git Bisect Help You Git 提供来很多的工具来帮助我们改进工作流程. bisect 命令就是其中之一, 虽然由于使用 ...
- Photoshop Elements2020强势来袭,教你三秒钟拯救闭眼照
Photoshop Elements2020强势来袭,一系列的黑科技让设计师和路人都惊叹不已!若某人的闭眼成为一张集体照的败笔,那该如何挽回? 想要挽救闭眼照?听起来很高大上,很困难?不,Photos ...
- 查找问题的利器 - Git Bisect
原文:http://gitbook.liuhui998.com/5_4.html 假设你在项目的'2.6.18'版上面工作, 但是你当前的代码(master)崩溃(crash)了. 有时解决这种问题的 ...
- [Practical Git] Diagnose which commit broke something with git bisect
Sometimes you find a bug in your project that has been around for a while without being noticed; it ...
- [转]查找问题的利器 - Git Bisect
转自:http://gitbook.liuhui998.com/5_4.html 假设你在项目的'2.6.18'版上面工作, 但是你当前的代码(master)崩溃(crash)了. 有时解决这种问题的 ...
- 清除ie10+浏览器的input输入框后面会出现的x号和闭眼logo
x号:::-ms-clear{display:none;} 闭眼logo: ::-ms-reveal{display:none;} tips:如果在外部引用的css里面没有作用,可以在写本页面的< ...
- Fighting regressions with git bisect---within git bisect algorithm
https://www.kernel.org/pub/software/scm/git/docs/git-bisect-lk2009.html Fighting regressions with gi ...
- 使用 git bisect 定位你的 BUG
Git 是开发者的好帮手,今天跟大家分享的是用 git bisect 来找到你代码中的 bad commit . 背景 你可能遇到过这种情况, 昨天下班前把模块开发完了, 单元测试验证通过, git ...
随机推荐
- prometheus之查询语言
PromQL(Prometheus Query Language)是 Prometheus 自己开发的表达式语言,语言表现力很丰富,内置函数也很多.使用它可以对时序数据进行筛选和聚合. 一.PromQ ...
- MongoDB从bson文件中恢复数据
首先需要到mangodb的安装目录的bin下面找到mongorestore.exe WIN10系统MongoDB安装目录bin文件夹下没有mongorestore.exe 先下载工具 https:/ ...
- RestTemplate-HTTP工具
RestTemplate 是由 Spring 提供的一个 HTTP 请求工具.在上文的案例中,开发者也可以不使用 RestTemplate ,使用 Java 自带的 HttpUrlConnection ...
- java静态方法和实例方法的区别
静态方法(方法前冠以static)和实例方法(前面未冠以static)的区别 调用静态方法或说类方法时,可以使用类名做前缀,也可以使用某一个具体的对象名:通常使用类名.static方法只能处理sta ...
- JavaScript 中 empty、remove 和 detach的区别
内容 empty.remove 和 detach的区别 jQuery 操作 DOM 之删除节点 方法名 元素所绑定的事件及数据是否也被移除 作用 $(selector).empty() 是 从被选元素 ...
- 在vue中实现点击哪个哪个区域变化背景色和字体颜色,其他默认(uni-app框架中也可以使用)
template: 1 <view class="wrap"> 2 <view class="total" :class="{ se ...
- SpringMVC详解及SSM框架整合项目
SpringMVC ssm : mybatis + Spring + SpringMVC MVC三层架构 JavaSE:认真学习,老师带,入门快 JavaWeb:认真学习,老师带,入门快 SSM框架: ...
- 2.Docker容器学习之新生入门必备基础知识
0x02 Docker 核心概念 描述:Docker的三大核心概念镜像/容器和仓库, 通过三大对象核心概念所构建的高效工作流程; 1.镜像 [image] 描述:images 类似于虚拟机镜像,借鉴了 ...
- JS将某个数组分割为N个对象一组(如,两两一组,三三一组等)
方法一: var result = []; var data = [ {name:'chen',age:'25'}, {name:'chen',age:'25'}, {name:'chen',age: ...
- 【面试普通人VS高手系列】HashMap是怎么解决哈希冲突的?
常用数据结构基本上是面试必问的问题,比如HashMap.LinkList.ConcurrentHashMap等. 关于HashMap,有个学员私信了我一个面试题说: "HashMap是怎么解 ...