使用 Git bisect 命令定位首次引入错误的提交
创始人
2024-03-02 13:28:51
0

Git 的 bisect 工具通过快速识别坏的提交,节省了时间和精力。

你是不是有过这样的经历:发现代码中有 错误 bug ,但不知道这个错误是什么时候引入的。这有可能是因为,某个人提交了一份有错误的代码,但没有在他的 Git 提交 commit 消息中声明它。这个错误可能已经存在了几周、几个月甚至几年,这意味着你需要搜索数百或数千个提交,才能找到问题何时出现的。而 git bisect 命令能够完美地解决这个问题!

git bisect 命令是一个强大的工具。你可以给 git bisect 命令一个范围,一端是一个已知的好状态,另一端是一个已知的坏状态。它会自动地确认当前范围的中点,在这个中点上进行测试,然后要求你确定那次提交是一个 好提交 good commit 还是一个 坏提交 bad commit ,然后它会重复这一“二分查找”的过程,直到你找到首次引入错误的那一次提交。

Image of Zeno’s paradox of Achilles.

这个“数学”工具是利用“二分查找”来找到错误之处的。git bisect 命令通过查看中点,然后由你来决定它是提交列表的新起点(即 “坏提交” )还是新终点(即 “好提交”),进而来缩小查找范围,如此在几次查找中你可以就能定位到有错误的提交。即使你有 10,000 个提交要检查,最多只需要 13 次查找,就能很快地定位到首次引入错误的提交。

  1. 提交 1 坏 <> 提交 10,000 好 => 提交 5,000 是坏的
  2. 提交 5,000 坏 <> 提交 10,000 好 => 提交 7,500 是好的
  3. 提交 5,000 坏 <> 提交 7,500 好 => 提交 6,250 是好的
  4. 提交 5,000 坏 <> 提交 6,250 好 => 提交 5,625 是坏的
  5. 提交 5,625 坏 <> 提交 6,250 好 => 提交 5,938 是坏的
  6. 提交 5,938 坏 <> 提交 6,250 好 => 提交 6,094 是好的
  7. 提交 5,938 坏 <> 提交 6,094 好 => 提交 6,016 是坏的
  8. 提交 6,016 坏 <> 提交 6,094 好 => 提交 6,055 是好的
  9. 提交 6,016 坏 <> 提交 6,055 好 => 提交 6,036 是坏的
  10. 提交 6,036 坏 <> 提交 6,055 好 => 提交 6,046 是坏的
  11. 提交 6,046 坏 <> 提交 6,055 好 => 提交 6,050 是坏的
  12. 提交 6,050 坏 <> 提交 6,055 好 => 提交 6,053 是好的
  13. 提交 6,053 坏 <> 提交 6,055 好 => 提交 6,054 是好的

对于上面这个例子,我们能知道 10,000 个提交中的第一个错误提交是第 6053 次提交。对于 git bisect 命令,最多需要几分钟就能完成检索。但是如果要一个一个查找每个提交是否错误,我甚至无法想象需要多长时间。

使用 Git bisect 命令

git bisect 命令使用起来非常简单:

(LCTT 译注:使用 git bisect start 命令来进入 bisect 模式,并且该命令指定了一个检查范围。它会告诉我们一共有多少次提交,大概需要几步就可以定位到具体的提交。)

$ git bisect start
$ git bisect bad        # Git assumes you mean HEAD by default
$ git bisect good  # specify a tag or commit ID for 

Git 检查中间的提交,并等待你声明这次提交是一个好提交还是一个坏提交:

(LCTT 译注:如果某一提交是可以通过的,则使用 git bisect good 命令标记;同样地,如果某一提交不能通过,则使用 git bisect bad 命令标记。)

$ git bisect good

$ git bisect bad

然后,git bisect 工具重复检查好提交和坏提交中间的那次提交,直到你告诉它:

$ git bisect reset

一些高级用户甚至可以自己编写脚本,来确定提交的好坏状态、并在找到特定提交时采取某一补救措施。你可能不会每天都使用 git bisect 命令,但当你需要它来定位首次引入错误的提交时,它会是一个很有用的救星。


via: https://opensource.com/article/22/11/git-bisect

作者:Dwayne McDaniel 选题:lkxed 译者:chai001125 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Git

相关内容

音画同步,AI视频也能有完...
机器之心报道 编辑:泽南 AI 生成的「最后一道关卡」已经突破...
2025-06-27 22:12:41
银河通用X清华大学发布首款...
该论文由清华大学与北京银河通用机器人有限公司合作完成。论文的共同第...
2025-06-12 17:11:39
【Git】pull 分支报...
报错消息 示例图: 示例代码: ➜ ...
2025-06-01 18:31:43
使用IDEA把项目上传到g...
使用IDEA把项目上传到gitee仓库在gitee上建立一个仓库第...
2025-06-01 17:15:00
本地新建项目如何推送到远程...
我本地新建了一个vue项目,想推送到远程的gitla...
2025-05-31 23:03:33
Windows环境安装及配...
欢迎关注博主 Mindtechnist 或加入【Linux C/C...
2025-05-31 21:41:26

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...