我如何使用git bisect查找第一个GOOD提交?

时间:2013-03-14 10:47:09

标签: git bisect

我有以下问题:

  • master的版本正常
  • master之前的最后一个标记的版本(比如last)有错误
  • 一位同事需要针对该特定错误的last修订补丁

好。让我们的朋友git bisect询问修复错误的修订:

git bisect start
git bisect bad last
git bisect good master

但这不起作用:

  

一些好的转速不是坏转的祖先   在这种情况下,git bisect无法正常工作   也许你错了好转和坏转?

任何提示要克服这个问题?我是否遗漏了文档中的内容?

5 个答案:

答案 0 :(得分:79)

从git 2.7开始,您可以使用参数--term-old和--term-new。

例如,您可以识别问题修复提交:

git bisect start --term-new=fixed --term-old=unfixed
git bisect fixed master
git bisect unfixed $some-old-sha1

在测试时,请酌情说出git bisect fixedgit bisect unfixed

旧答案,对于2.7之前的git版本

为什么不创建一些别名,而不是暂时训练自己认为坏意味着好,好意味着坏,为什么不创建一些别名?

~/.gitconfig中添加以下内容:

[alias]
        bisect-fixed = bisect bad
        bisect-unfixed = bisect good

您可以开始识别问题修复提交:

$ git bisect start
$ git bisect-fixed master
$ git bisect-unfixed $some-old-sha1

在测试时,请酌情说出git bisect-fixedgit bisect-unfixed

答案 1 :(得分:46)

我只是“欺骗”git并交换良好的含义< =>坏。

换句话说,将“坏”视为不会出现问题的内容,因此这不是基于补丁的“好”版本。

无论如何,好的和坏的都是相当主观的概念,对吧? :)

git bisect start
git bisect good last
git bisect bad master

答案 2 :(得分:19)

如果您正在使用git bisect run,就像我使用Perl的prove命令(运行自动测试)一样,您就无法交换goodbad 。测试的成功将作为退出代码报告。

我找到了一个有效的Bash语法来否定git bisect run运行的程序的退出代码:

git bisect start
git bisect bad HEAD                 # last revision known to PASS the tests
git bisect good $LAST_FAIL_REVISION # last revision known to FAIL the tests
git bisect run bash -c "! prove"

这给了我{em>传递由prove运行的测试的第一次修订。

答案 3 :(得分:6)

Git现在允许您使用oldnew而无需先定义它们。您必须在没有提交的情况下调用git bisect start作为进一步的参数,然后通过调用

正确地启动二分法
git bisect old <rev>
git bisect new <rev>

https://git-scm.com/docs/git-bisect#_alternate_terms

这基本上是@MarcH建议应该实施的。

答案 4 :(得分:5)

Git别名是一个好主意,但是fixedunfixed这两个术语与goodbad的问题相同:你不能让它们与两者回归和进展。很容易找到以任何一种方式工作的单词:简单地从最初的二进制搜索术语中选择它们,这些术语本质上是中立的,没有任何好的或坏的概念。例如:

git config --global alias.bisect-high 'bisect bad'
git config --global alias.bisect-low  'bisect good'

使用这些中性字词,您可以随时输入:git bisect-high(或git bisect-uppergit-bisect max,...您的选择!)您是否正在寻找用于回归或修复

太糟糕了,git bisect开发人员不能简单地重复使用任何现有术语。一般来说,用户界面并不是git的关注点:http://stevebennett.me/2012/02/24/10-things-i-hate-about-git/