我有以下问题:
master
的版本正常master
之前的最后一个标记的版本(比如last
)有错误last
修订补丁好。让我们的朋友git bisect
询问修复错误的修订:
git bisect start
git bisect bad last
git bisect good master
但这不起作用:
一些好的转速不是坏转的祖先 在这种情况下,git bisect无法正常工作 也许你错了好转和坏转?
任何提示要克服这个问题?我是否遗漏了文档中的内容?
答案 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 fixed
或git 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-fixed
或git bisect-unfixed
。
答案 1 :(得分:46)
我只是“欺骗”git并交换良好的含义< =>坏。
换句话说,将“坏”视为不会出现问题的内容,因此这不是基于补丁的“好”版本。
无论如何,好的和坏的都是相当主观的概念,对吧? :)
git bisect start
git bisect good last
git bisect bad master
答案 2 :(得分:19)
如果您正在使用git bisect run
,就像我使用Perl的prove
命令(运行自动测试)一样,您就无法交换good
和bad
。测试的成功将作为退出代码报告。
我找到了一个有效的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现在允许您使用old
和new
而无需先定义它们。您必须在没有提交的情况下调用git bisect start
作为进一步的参数,然后通过调用
git bisect old <rev>
git bisect new <rev>
https://git-scm.com/docs/git-bisect#_alternate_terms
这基本上是@MarcH建议应该实施的。
答案 4 :(得分:5)
Git别名是一个好主意,但是fixed
和unfixed
这两个术语与good
和bad
的问题相同:你不能让它们与两者回归和进展。很容易找到以任何一种方式工作的单词:简单地从最初的二进制搜索术语中选择它们,这些术语本质上是中立的,没有任何好的或坏的概念。例如:
git config --global alias.bisect-high 'bisect bad'
git config --global alias.bisect-low 'bisect good'
使用这些中性字词,您可以随时输入:git bisect-high
(或git bisect-upper
或git-bisect max
,...您的选择!)您是否正在寻找用于回归或修复。
太糟糕了,git bisect开发人员不能简单地重复使用任何现有术语。一般来说,用户界面并不是git的关注点:http://stevebennett.me/2012/02/24/10-things-i-hate-about-git/