Git Bisect 怎么用?我试了但找不到引入 bug 的提交
我在用 Git Bisect 排查一个 UI 显示异常的问题,但跑完流程后它标出的“坏提交”根本没改过相关代码,感觉不对劲。我是不是哪里操作错了?
我怀疑是某个提交不小心删了 class 名,比如下面这段 HTML 原本是有 container 类的:
<div class="container mx-auto p-4">
<h1>用户列表</h1>
<ul id="user-list"></ul>
</div>
现在页面布局乱了,但 bisect 最后指向了一个只改了 README 的提交,完全不相关,这咋回事?
最可能的原因是你标记 good 和 bad 的节点有问题。比如你把一个实际上已经有 bug 的提交标记成了 good,那 bisect 的结果肯定不准。建议你先确认一下:那个被标记为 good 的老提交,切过去跑一下,bug 真的不存在吗?
第二个常见问题是测试过程不可靠。UI 问题有时候会有缓存、依赖版本、或者构建产物没清干净的情况。你 bisect 过程中每次切换提交后,是不是都重新构建了?前端项目尤其要注意
node_modules和dist目录,有时候旧的构建产物会干扰判断。建议每次测试前跑一下清理命令,比如:第三个问题可能是合并提交导致的。如果你的项目有 merge commit,bisect 默认会走一条线性路径,有时候会跳过某些分支上的提交。这种情况下可以试试
git bisect --first-parent或者手动检查合并点。还有一种情况,bug 可能不是代码本身引入的,而是依赖包版本变化、环境配置、甚至浏览器缓存导致的。你提到是 UI 显示异常,class 名丢了,这种问题特别容易被干扰。建议你用无痕模式或者清掉浏览器缓存再测试。
再说一下正确的 bisect 流程:
然后 Git 会自动跳到中间的某个提交,你手动测试后标记:
重复这个过程直到定位到具体提交。如果你嫌手动测试太累,可以写个自动化脚本:
脚本返回 0 表示 good,返回 1 表示 bad。
最后给你一个排查建议:既然你怀疑是 class 名被删了,直接用
git log -S "container" --oneline搜索一下哪些提交改动过这个字符串,可能比 bisect 更快定位问题。这个命令会显示所有涉及 "container" 字符串变更的提交和具体改动内容,一眼就能看出是谁删了 class 名。