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

eck*_*kes 84 git bisect

我有以下问题:

  • 该版本master工作正常
  • 之前的最后一个标签的版本master(比如说last)有一个bug
  • 一位同事需要一个补丁来last修改那个特定的错误

好的.让我们的朋友git bisect去修复修复bug的修改:

git bisect start
git bisect bad last
git bisect good master
Run Code Online (Sandbox Code Playgroud)

但这不会起作用:

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

有什么提示可以克服这个问题?我在文档中遗漏了什么吗?

Mic*_*olf 86

从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
Run Code Online (Sandbox Code Playgroud)

当你测试,说git bisect fixedgit bisect unfixed适当时.

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

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

~/.gitconfig添加以下内容:

[alias]
        bisect-fixed = bisect bad
        bisect-unfixed = bisect good
Run Code Online (Sandbox Code Playgroud)

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

$ git bisect start
$ git bisect-fixed master
$ git bisect-unfixed $some-old-sha1
Run Code Online (Sandbox Code Playgroud)

当你测试,说git bisect-fixedgit bisect-unfixed适当时.

  • 顺便说一句,git不允许你创建子命令的别名.因此破折号.如果它实际上是(或可能),希望有人会更新答案. (5认同)
  • 即使你使用别名,git的输出也不会,所以它仍会报告foo`是第一个糟糕的提交`,所以看来临时训练仍然是必要的,不是吗? (3认同)
  • 有道理.(赞成你的评论.)尽管如此,希望它至少可以减少额外的认知负担,并且作为程序员我们已经有了很多. (2认同)
  • 这真的有效吗?我已经尝试过,但它没有成功,因为 `git bisect` 仍然假设成功的退出代码意味着“向前移动”,不成功的退出代码意味着“向后移动”,只有当旧提交意味着成功和新提交时才有效commit 表示不成功。如果与恢复构建退出代码的脚本结合使用,我只能成功地完成这项工作,例如[this](https://melix.github.io/blog/2014/07/bisecting-groovy.html) (2认同)

ing*_*ger 46

我只是"欺骗"git并交换好的<=>坏的意思.

换句话说,将"坏"视为没有出现问题的东西,因此这不是基于补丁的"好"版本.

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

git bisect start
git bisect good last
git bisect bad master
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个答案. (3认同)
  • 好吧,如果你想一想,没有一般意义有什么好或坏(甚至可能不是宗教)......它只取决于你的目的.这种方式并不是真的作弊 - 但也许是Git的罪(留在宗教话题上:D是要选择这样一个有争议的术语,而不是一个更中立的"目标"/"起源"......但是,哲学可以是 - 令人难以置信的;-) (2认同)
  • 这就是我在发现这个问题之前所做的。我不会再这样做了。请记住,只需要一个错误的答案,整个平分就会出错。别扭曲你的想法。 (2认同)

Dan*_*mer 20

如果你正在使用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"
Run Code Online (Sandbox Code Playgroud)

这给了我第一次通过测试的修订版prove.

  • 我同意,我不想修改我的测试用例,所以这是完美的。 (3认同)

GKF*_*KFX 7

Git现在允许您使用old,new而无需先定义它们.您必须在git bisect start没有提交的情况下调用作为进一步的参数,然后通过调用正确地启动二分

git bisect old <rev>
git bisect new <rev>
Run Code Online (Sandbox Code Playgroud)

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

这基本上是@MarcH建议应该实施的内容.


Mar*_*rcH 5

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

git config --global alias.bisect-high 'bisect bad'
git config --global alias.bisect-low  'bisect good'
Run Code Online (Sandbox Code Playgroud)

使用这些中性术语,无论您是在寻找回归还是修复,您都可以输入:( git bisect-high或者git bisect-upper,或者git-bisect max......您的选择!).

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