Git Bisect
最后更新
git bisect 通过二分查找,找出引入 bug 的那个提交。你告诉它一个确定正常的提交和一个确定有问题的提交;它会检出两者中间的一个提交,由你标记它是好是坏,每次都把范围缩小一半。所以即使有几千个提交,它也只需几步就能找出罪魁祸首。
在终端在线编辑器中试试这些命令:浏览器里就有一个真正的 shell,无需安装任何东西。
语法
| 命令 | 作用 |
|---|---|
git bisect start | 开始一次二分查找 |
git bisect bad | 把当前提交标记为有问题 |
git bisect good <hash> | 标记一个确定正常的提交 |
git bisect good / git bisect bad | 标记每个测试过的提交 |
git bisect run ./test.sh | 自动化:每一步都运行测试来标记 |
git bisect reset | 结束二分查找,回到你的分支 |
完整示例
找出是哪个提交导致构建失败。
| 步骤 | 命令 | 结果 |
|---|---|---|
| 1 | git bisect start | 开始查找 |
| 2 | git bisect bad | 当前提交有问题 |
| 3 | git bisect good v1.0 | 这个旧标签是正常的 |
| 4 | 测试,然后执行 good/bad | 重复,直到 Git 指出是哪个提交 |
Git bisect 常见问题
git bisect 是做什么的?
它在你的提交历史中执行二分查找,找出引入 bug 的确切提交。你把一个提交标记为 good,另一个标记为 bad;Git 会反复检出中间的提交让你测试,每次把查找范围缩小一半,直到找出第一个有问题的提交。
git bisect 怎么用?
运行
git bisect start,用 git bisect bad 标记当前有问题的状态,再用 git bisect good <hash> 标记一个确定正常的提交。Git 会检出一个中间提交;测试它,然后运行 git bisect good 或 git bisect bad。重复这个过程,直到 Git 报告第一个有问题的提交,最后运行 git bisect reset。git bisect 能自动化吗?
能。
git bisect run <script> 会在每一步运行你的脚本:提交正常时脚本应以 0 退出,有问题时以非 0 退出(测试运行器很适合)。这样 Git 就会自动完成二分查找,不用你手动标记每个提交,最后打印出有问题的那个提交。如何结束二分查找?
运行
git bisect reset 结束这次查找,回到开始之前所在的分支和提交。不管有没有找到有问题的提交都要这样做,它会清理二分查找留下的临时状态。可以在线练习吗?
可以。打开终端在线编辑器,就能在浏览器里真正的 shell 中运行
git bisect,无需安装任何东西。Coddy 免费的互动式 Git 课程也会一步步讲解如何查看历史。