2020-06-29
Ann Ann
git bisect
是一个很有用的命令,用来查找哪一次代码提交引入了错误。
它的原理很简单,就是将代码提交的历史,按照两分法不断缩小定位。所谓“两分法”,就是将代码历史一分为二,确定问题出在前半部分,还是后半部分,不断执行这个过程,直到范围缩小到某一次代码提交。
本文通过一个实例,解释如何使用这个命令。下面是一个代码库,请将它克隆到本地。
$ git clone git@github.com:bradleyboy/bisectercise.git
$ cd bisectercise
这个库是一个网页index.html
,在浏览器打开这个网页。
$ open index.html
网页上是一个计数器,有两个按钮。点击+
号按钮,可以看到计数器没有递增,反而递减,这说明代码有问题。
现在,就要来查找,到底哪一次代码提交,引入了错误。首先,检查一下代码提交历史。
$ git log --pretty=oneline
可以看到,这个库一共有101次提交。最早的第一次提交的哈希是4d83cf
。
git bisect start
命令启动查错,它的格式如下。
$ git bisect start [终点] [起点]
上面代码中,“终点”是最近的提交,“起点”是更久以前的提交。它们之间的这段历史,就是差错的范围。
这个例子中,我们选择全部的代码历史。起点是第一次提交4d83cf
,终点是最近一次的HEAD
。当然,指定其他范围也可以。
$ git bisect start HEAD 4d83cf
执行上面的命令以后,代码库就会切换到这段范围正当中的那一次提交,本例是第51次提交。
现在刷新浏览器,点击+
按钮,发现可以正常递增。使用git bisect good
命令,标识本次提交(第51次)没有问题。
$ git bisect good
既然第51次提交没有问题,就意味着错误是在代码历史的后半段引入的。执行上面的命令,Git 就自动切换到后半段的中点(第76次提交)。
现在刷新浏览器,点击+
按钮,发现不能正常递增。使用git bisect bad
命令,标识本次提交(第76)有问题。
$ git bisect bad
执行上面的命令以后,Git 就自动切换到第51次到第76次的中点(第63次提交)。
接下来,不断重复这个过程,直到成功找到出问题的那一次提交为止。这时,Git 会给出如下的提示。
b47892 is the first bad commit
既然找到那个有问题的提交,就可以检查代码,确定具体是什么错误。
然后,使用git bisect reset
命令,退出查错,回到最近一次的代码提交。
$ git bisect reset
现在就可以开始修复错误了。
IT Support 训练营01期
2025/11/10 06:13 (Sydney)
CCNA考证班01期
2025/09/06 08:37 (Sydney)
商业数据分析实战班第17期
2025/03/15 06:13 (Sydney)
地址
Level 10b, 144 Edward Street, Brisbane CBD(Headquarter)Level 2, 171 La Trobe St, Melbourne VIC 3000四川省成都市武侯区桂溪街道天府大道中段500号D5东方希望天祥广场B座45A13号Business Hub, 155 Waymouth St, Adelaide SA 5000Disclaimer
JR Academy acknowledges Traditional Owners of Country throughout Australia and recognises the continuing connection to lands, waters and communities. We pay our respect to Aboriginal and Torres Strait Islander cultures; and to Elders past and present. Aboriginal and Torres Strait Islander peoples should be aware that this website may contain images or names of people who have since passed away.
匠人学院网站上的所有内容,包括课程材料、徽标和匠人学院网站上提供的信息,均受澳大利亚政府知识产权法的保护。严禁未经授权使用、销售、分发、复制或修改。违规行为可能会导致法律诉讼。通过访问我们的网站,您同意尊重我们的知识产权。 JR Academy Pty Ltd 保留所有权利,包括专利、商标和版权。任何侵权行为都将受到法律追究。查看用户协议
© 2017-2024 JR Academy Pty Ltd. All rights reserved.
ABN 26621887572