我最近尝试使用git bisect
,但它没有用。树仍然在主人身上,我没有看到git bisect
的任何输出。这是我尝试过的:
git bisect start
git bisect bad # no output, tried a couple of times
git bisect good # no output
git bisect reset #-> Already on 'master'
我试过两个不同的回购。没工作。 git --version在Ubuntu 9.10上是1.6.3.3 有什么想法吗?
答案 0 :(得分:18)
Git Bisect简介
“git bisect”起初可能有点令人困惑。一旦你理解它的作用,就会很容易。
“git bisect”的典型场景是:刚刚发现了一个bug。你想知道哪个rev引入了bug。您知道最新版本中存在该错误,但它是在之前的版本中引入的。您需要一种方法来确定是否存在该错误。这可以是自动测试,也可以是手动测试。
让我们开始吧。从您分支机构的最新版本开始,发出:
git bisect start
然后告诉git当前的版本是坏的:
git bisect bad
现在我们需要找到一个好的转速。检查一个足够老的东西,没有错误。如果你认为32转前应该是好的,那么:
git checkout HEAD~32
运行测试以查看是否有错误。如果它有bug,你需要尝试更老的转速(再次发出“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最终弄清楚哪个转速开始出现问题时,你会得到类似的结果:
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“hand off”
如果您的测试是自动的,那么您可以让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”。它将继续这样做,直到找到引入该bug的提交。你所要做的就是坐下来观看。
完成后
完成后,发出:
git bisect reset
Git会把你带回到你开始的地方。
答案 1 :(得分:1)
你尝试过的失败是因为你告诉它同样的树木既好又坏。这显然没有任何意义
git bisect start # tells git you want to do a bisect operation
git bisect bad # tells git the current treesh (HEAD) is bad
git bisect good # tells git the current treeish (HEAD) is good
因为给定的树木可能是好的而且坏的git只是假设你正在纠正自己。
这里的关键是,如果你没有指定树形git假设你指的是当前的那个。
更好的方法是先找到事情有效的提交树。然后...
git bisect start
git bisect bad # tells it HEAD is bad
git bisect good abc123 # treeish of the good commit
之后,bisect将自动开始运行。您仍然必须与它进行交互并告诉它已分割提交的状态(或者编写一个脚本来自动化它)。