git bisect没有返回任何输出

13
我最近尝试使用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'

我在两个不同的仓库上尝试了这个。没有成功。Ubuntu 9.10 上的 git --version 是1.6.3.3。 有什么想法吗?

你传递给 goodbad 的参数是什么?"bad" 提交是否是 "good" 提交的后代? - CB Bailey
我遇到了同样的问题。在执行 git bisect start 然后执行 git bisect bad 或者 git bisect good 后没有输出。无论我执行多少次 git bisect goodgit bisect badgit bisect visualize 始终输出 You need to give me at least one good and one bad revision. (You can use "git bisect bad" and "git bisect good" for that.) - frediy
2个回答

23

介绍 Git Bisect

"git bisect" 开始时可能有点令人困惑。一旦你理解了它的作用,就会变得容易。

"git bisect" 的典型场景是:刚刚发现了一个错误。你想找出是哪个版本引入了该错误。你知道该错误存在于最新的版本中,但它是在之前的版本中引入的。你需要一种方法来确定该错误是否存在。这可以是自动测试,也可以是手动运行的测试。

让我们开始吧。从你的分支中的最新版本开始,输入:

git bisect start

然后告诉 git 当前版本已知有问题:

git bisect bad

现在我们需要找到一个好的版本。检查一下是否有足够老的版本来避免这个错误。如果你认为32个版本之前应该是好的,那么:
git checkout HEAD~32

运行你的测试,看看是否有bug。如果有bug,你需要尝试一个更早的版本(只需再次输入“git checkout HEAD~32”)。一旦你找到一个没有bug的版本,那么:
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 # 测试通过` - `git bisect bad # 测试失败` - `git bisect skip # 由于某些原因无法在此版本上运行测试(无法编译等)`
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 "无需干预"

如果你的测试是自动化的,那么你可以让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会把你带回起点。

“git bisect run” 将继续运行,直到找到引入错误的提交。而不是第一个坏版本。 - Lorenz
@Lorenz,我的意思是按照提交顺序,而不是 bisect 先检查的。我承认措辞不够清晰,感谢指出。我会进行更新。 - Wayne Conrad
这是有关Git Bisect工作原理的介绍,而不是问题的答案。问题在于尽管按照通用说明使用了Git Bisect,但它并没有正常工作。这是一个很好的入门介绍。 - frediy
1
@the_minted 感谢夸奖。我认为这个答案确实解决了 OP 的问题;原问题中并没有展示 OP 在执行 "git bisect good" 或者 "git bisect bad" 之前使用 "git checkout" 命令来切换 HEAD,正如本回答所示。 - Wayne Conrad
2
你说得对 - 在 git bisect start 之后使用 git checkout HEAD~N 可以解决这个问题。另一种方法是在开始语句中指定提交边界,像这样 git start HEAD HEAD~N。不幸的是,我的负面投票已经锁定了,所以我无法撤回它。 - frediy
2
@the_minted 没问题。在我弄清楚在哪里兑换这些积分换取烤面包机或其他东西之前,我拥有多少积分并不重要。 - Wayne Conrad

1
你尝试的失败了,因为你告诉它相同的treeish既是好的又是坏的。这显然没有任何意义。
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假定您正在纠正自己。

关键在于,如果您没有指定treeish,则Git会假定您指的是当前的treeish。

更好的做法是首先找到事情正常的提交的treeish。然后...

git bisect start
git bisect bad # tells it HEAD is bad
git bisect good abc123   # treeish of the good commit

之后,二分将自动开始运行。但是您仍然需要与其交互,并告诉它二分提交的状态(或编写脚本以自动化操作)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接