当前位置: 首页 > 科技观察

使用Gitbisect命令定位第一次引入错误的commit

时间:2023-03-14 15:58:58 科技观察

你是否有过这样的经历:发现代码有bug,却不知道错误是什么时候引入的。有可能有人提交了错误代码,但没有在他的Git提交消息中声明。该错误可能已经存在数周、数月甚至数年,这意味着您需要搜索成百上千次提交才能找到问题出现的时间。而gitbisect命令可以完美解决这个问题!gitbisect命令是一个强大的工具。您可以为gitbisect命令提供一个范围,其中一端为已知良好状态,另一端为已知不良状态。它会自动确认当前范围的中点,在这个中点进行测试,然后让你判断这个commit是好commit还是坏commit,然后它会重复这个“二分查找”的过程,直到找到这个commit首先引入了错误。芝诺阿喀琉斯悖论的形象。这个“数学”工具使用“二进制搜索”来查找错误。gitbisect命令通过查看中点并让您决定它是提交列表的新起点(即“错误提交”)还是新终点(即“良好提交”)来缩小搜索范围,如您可以在几次查找中找到错误的提交。即使您有10,000个提交要检查,也只需要最多13次查找就可以快速找到最先引入bug的提交。提交1次不良<>提交10,000次良好=>提交5,000次不良提交5,000次不良<>提交10,000次良好=>提交7,500次良好提交5,000次不良<>提交7,500次良好=>提交6,250次良好提交5,000次不良<>提交6,250次良好=>提交5,625不好提交5,625不好<>提交6,250好=>提交5,938不好提交5,938不好<>提交6,250好=>提交6,094好提交5,938不好<>提交6,094好=>提交6,016不好提交6,016坏<>提交6,094好=>提交6,055好提交6,016坏<>提交6,055好=>提交6,036不好提交6,036坏<>提交6,055好=>提交6,046不好提交6,046坏<>提交6,055好=>commit6,050是错误的commit6,050错误<>commit6,055good=>commit6,053是好的commit6,053错误<>commit6,055good=>commit6,054是好的对于上面的例子,我们知道10,000次提交中的第一个错误提交是commit6053.对于gitbisect命令,最多可能需要几分钟才能完成检索。但是我什至无法想象要花多长时间才能一一找出每次提交是否错误。使用Gitbisect命令gitbisect命令使用起来非常简单:(LCTT译注:使用gitbisectstart命令进入bisect模式,命令指定一个检查范围。它会告诉我们有多少大约需要几步找到特定的提交。)$gitbisectstart$gitbisectbad#Git默认假定你指的是HEAD$gitbisectgood#为指定标签或提交IDGit在中间检查提交,并等待你声明thiscommitisacommitAgoodcommitorabadcommit:(LCTT译注:如果一个commit是可以通过的,使用gitbisectgood命令标记它;同理,如果一个commit失败,使用gitbisectbad命令标记。)$gitbisectgood或$gitbisectbad然后,gitbisect工具反复检查好提交和坏提交中间的提交,直到你告诉它:$gitbisectreset一些高级用户甚至可以编写自己的脚本来确定提交的好坏状态,并在发现特定提交时采取一些补救措施。您可能不会每天都使用gitbisect命令,但是当您需要它来定位首次引入错误的提交时,它可以成为一个有用的救星。