Git Bisect 简介
“git bisect”起初可能有点令人困惑。一旦你了解它的作用,它就会很容易。
“git bisect”的典型场景是:刚刚发现了一个错误。您想找出哪个版本引入了该错误。您知道该错误存在于最新版本中,但它是在之前的版本中引入的。您将需要一种方法来确定该错误是否存在。这可以是自动测试,也可以是您手动运行的测试。
让我们开始吧。从分支中的最新版本开始,发出:
git bisect start
然后告诉 git 当前版本是错误的:
git bisect bad
现在我们需要找到一个好的转速。检查一个足够老的东西,没有错误。如果您认为 32 转前应该不错,那么:
git checkout HEAD~32
并运行您的测试以查看它是否存在错误。如果它有错误,您将需要尝试更旧的版本(只需再次发出“git checkout HEAD~32”)。一旦您登陆没有错误的转速,然后:
git bisect good
这告诉 git 当前版本是好的。Git 将立即检查介于好转速和坏转速之间的转速;你会看到输出,例如:
$ git bisect good
Bisecting: 7 revisions left to test after this (roughly 3 steps)
[909ba8cd7698720d00b2d10738f6d970a8955be4] Added convenience delegators to Cache
运行您的测试,并根据测试结果发出以下命令之一:
git bisect good # the test passed
git bisect bad # the test failed
git bisect skip # we can't run the test on this rev for some reason
(doesn't compile, etc.)
Git 将继续更改为不同的转速,你会一直告诉它好、坏或跳过。当 git 最终确定是哪个 rev 引起了所有麻烦时,您将得到如下信息:
b25ab3cee963f4738264c9c9b5a8d1a344a94623 is the first bad commit
commit b25ab3cee963f4738264c9c9b5a8d1a344a94623
Author: Wayne Conrad <wconrad@yagni.com>
Date: Fri Dec 25 18:20:54 2009 -0700
More tests and refactoring
:040000 040000 6ff7502d5828598af55c7517fd9626ba019b16aa 39f346cb5a289cdb0955fcbba552f40e704b7e65 M routecalc
在第一次错误提交时,您当前的转速将在那里。
运行 git bisect “放手”
如果您的测试是自动的,那么您可以让 git 完成所有工作。做你在上面开始所做的一切:
git bisect start
git bisect bad
git checkout HEAD~32 # or however far back it takes to find a good rev
git bisect good
现在是魔术。您所需要的只是一个测试程序,它返回退出代码“0”表示成功,1(例如)表示失败。告诉 git 你的测试:
git bisect run tests/mytest.rb
Git 现在将运行测试,使用结果自动执行“git bisect good”或“git bisect bad”。它将继续这样做,直到找到引入错误的提交。您所要做的就是坐下来观看。
当你完成
完成后,发出:
git bisect reset
Git 会让你回到你开始的地方。