使用 Git Bisect 调试
使用 `git bisect` 高效找出引入错误的具体提交,节省宝贵的调试时间。
使用 Git Bisect 调试 是 CoddyKit 上的免费 Git & GitHub Professional Workflow 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Git & GitHub Professional Workflow 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Git & GitHub Professional Workflow 课程共包含 4 节课。
使用 Git 更快地查找错误
调试可能很棘手。有时出现了错误,您却不知道是哪次更改导致的。
git bisect 是一个强大的 Git 命令,可以帮助您精确定位引入错误的提交。它使用二分查找算法,快速缩小数千个提交的范围。
二分查找的力量
假设您的项目有 100 个提交,而错误出现在第一个和最后一个提交之间的某处。手动逐个检查每个提交会非常慢!
git bisect 的工作方式类似于“猜数字”游戏:
- 告诉 Git 一个“正常”提交(当时错误尚未出现)。
- 告诉 Git 一个“异常”提交(当时错误已经出现)。
- Git 选择大致位于中间的提交,并要求您进行测试。
- 您将其标记为“正常”或“异常”,Git 就会把搜索范围缩小一半。
开始搜索!
首先,您需要告诉 Git 要开始一次二分查找会话。此命令会初始化该过程:
git bisect start
开始后,您需要指定一个已知的“异常”提交(存在错误)和一个已知的“正常”提交(确定不存在错误)。
通常,“异常”提交是当前的 HEAD,而“正常”提交可能是较早版本的发布标签,或几天前的某个提交。
标记提交边界
启动 git bisect 后,您需要定义搜索范围:
- 异常提交:这是一个您确定存在错误的提交。使用
git bisect bad <commit-hash>,如果它是当前的HEAD,也可以直接使用git bisect bad。 - 正常提交:这是一个您确定不存在错误的提交。使用
git bisect good <commit-hash>。
然后,Git 会自动切换到该范围中间的一个提交。
测试并逐步缩小范围
标记好正常和异常提交后,Git 会自动切换到范围中间的一个提交。您的任务是测试该提交中的代码。
- 如果存在错误,请输入
git bisect bad。 - 如果不存在错误,请输入
git bisect good。
然后,Git 会从剩余范围中选择另一个中间提交。您需要重复此过程,直到 Git 找到第一个“异常”提交。
模拟错误的引入过程
让我们设想一个脚本中的简单“错误”。我们将模拟一个项目历史,其中引入了一个小错误。
这是最初的“正常”脚本:
main.sh
#!/bin/bash
echo "Hello from script!"
sum=0
for i in $(seq 1 3); do
sum=$((sum + i))
done
echo "Sum is: $sum"手动二分查找演示
现在,假设后来的某次提交不小心将循环修改为 seq 1 4,导致总和错误(应为 6,却变成了 10)。
我们先执行:
git bisect start
然后将当前的 HEAD(存在错误的位置)标记为异常:
git bisect bad HEAD
再将一个较早且已知正常的提交标记为正常:
git bisect good <old_good_commit_hash>
接下来,Git 会引导您逐个检查提交。您可以运行 ./main.sh,查看总和是 6 还是 10,然后相应地输入 git bisect good 或 git bisect bad。
自动化调试过程
如果测试较为复杂,手动测试每个提交仍然可能很耗时。git bisect run 可以让您自动完成这项工作!
您需要提供一个脚本,使其返回以下退出状态:
- 如果提交正常,则返回
0(零)。 - 如果应跳过该提交,则返回
125。 - 如果提交异常,则返回其他非零值(例如
1)。
Git 会在每个待测试的提交上执行此脚本,直到找到错误。
#!/bin/bash
./main.sh | grep "Sum is: 6"
if [ $? -eq 0 ]; then
exit 0 # Good commit
else
exit 1 # Bad commit
fi完成搜索
当 git bisect 成功找出第一个异常提交后,它会告诉您该提交的哈希值和提交说明。
找到罪魁祸首并了解问题后,务必将仓库恢复到二分查找开始前的原始状态:
git bisect reset
此命令会将您带回启动二分查找时所在的提交,并清理临时的二分查找状态。
二分查找知识检查
您刚刚运行了 git bisect start,将当前的 HEAD 标记为异常,并将较早的提交标记为正常。Git 切换到了中间的一个提交。
您运行了测试,发现该中间提交中存在错误。
`git bisect` 总结
恭喜您!您已经学会了如何使用 git bisect:
- 这是一个用于精确查找引入错误的提交的强大工具。
- 它使用二分查找来提高效率。
- 您需要定义“正常”(没有错误)和“异常”(存在错误)的提交。
- 可以使用
git bisect run <script>自动化测试过程。 - 搜索完成后,始终记得运行
git bisect reset进行清理!
常见问题解答
「使用 Git Bisect 调试」课时是免费的吗?
是的 — 「使用 Git Bisect 调试」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Git & GitHub Professional Workflow 课程的其余内容,请升级到 CoddyKit PRO。 Git & GitHub Professional Workflow 课程共包含 4 节课。
「使用 Git Bisect 调试」这节课中我会学到什么?
使用 `git bisect` 高效找出引入错误的具体提交,节省宝贵的调试时间。 你通过在浏览器中直接运行的动手代码来练习 Git & GitHub Professional Workflow,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Git & GitHub Professional Workflow 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Git & GitHub Professional Workflow 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「使用 Git Bisect 调试」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Git & GitHub Professional Workflow 课中编写并运行代码吗?
能。每节 Git & GitHub Professional Workflow 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Git Reflog 与恢复历史
- 使用 Git Bisect 调试
- 仓库维护与清理
- 使用 git filter-repo 重写历史