我怎么能用git bisect来find第一个好的提交?
我有以下问题:
-
master
版本工作正常 -
master
(last
)之前的最后一个标记的版本有一个错误 - 一个同事需要一个修补程序来修补那个bug
好的。 让我们来问问我们的朋友git bisect
修复bug的修改:
git bisect start git bisect bad last git bisect good master
但是这不起作用:
一些好的转速不是糟糕的转速的祖先。
在这种情况下,git bisect无法正常工作。
也许你错误的好转和坏转?
任何提示要克服这个? 我错过了文档中的东西吗?
从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
在你testing的时候,说一下git bisect fixed
或者git bisect unfixed
。
旧的答案,2.7版之前的git版本
不要临时训练自己去认为坏的意味着好的意味着坏,为什么不创build一些别名呢?
在~/.gitconfig
添加以下内容:
[alias] bisect-fixed = bisect bad bisect-unfixed = bisect good
您可以开始识别问题修复提交:
$ git bisect start $ git bisect-fixed master $ git bisect-unfixed $some-old-sha1
正如你testing,说适当的git bisect-fixed
或git bisect-unfixed
git bisect-fixed
。
我只是“欺骗”git和交换好<=>坏的意思。
换句话说,把“坏”视为不会出现问题的东西,所以这不是以你的补丁为基础的“好”版本。
无论如何,好的和坏的都是非常主观的概念,对吗? 🙂
git bisect start git bisect good last git bisect bad master
如果你使用git bisect run
就像我用Perl的prove
命令(它运行自动testing)一样,你没有机会只是交换good
和bad
。 testing的成功将作为退出代码报告。
我find了一个有效的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"
这给了我第一次修改通过prove
运行的testing。
Git别名是一个好主意,但是fixed
和unfixed
的术语具有相同的问题,而不是good
和bad
:你不能让它们兼容回归和进度。 很容易find任何一种工作方式的词汇:只需从原始的二分法search术语中挑选出来,这种术语本质上是中性的,对于什么是好或者不好有什么先入之见。 例如:
git config --global alias.bisect-high 'bisect bad' git config --global alias.bisect-low 'bisect good'
用这样的中性术语,你总是可以input: git bisect-high
(或者git bisect-upper
,或者git-bisect max
,…你的select!) 无论你是寻找回归还是修复 。
糟糕的是,git bisect开发人员不能简单地重用任何现有的术语。 用户界面通常不是git的关注点: http : //stevebennett.me/2012/02/24/10-things-i-hate-about-git/
Git现在可以让你使用old
,而不必先定义它们。 你必须调用git bisect start
而不需要提交作为进一步的参数,然后通过调用正确地启动二等分
git bisect old <rev> git bisect new <rev>
https://git-scm.com/docs/git-bisect#_alternate_terms
这基本上是@MarcHbuild议应该实施的。