12

我最近尝试使用git bisect,但它只是没有用。树仍然在 master 中,我没有看到任何输出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 有什么想法吗?

4

2 回答 2

19

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 会让你回到你开始的地方。

于 2010-01-12T08:37:38.373 回答
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

之后对分将开始自动运行。您仍然必须与它交互并告诉它被二等分的提交的状态(或编写一个脚本来自动化它)。

于 2014-08-07T17:45:34.817 回答