web-dev-qa-db-ja.com

どうすればgit bisectを使用して最初のGOODコミットを見つけることができますか?

次の問題があります。

  • masterのバージョンは正常に動作します
  • master(たとえばlast)の前の最後のタグのバージョンにバグがある
  • 同僚は、その特定のバグに対するlastリビジョンのパッチを必要としています

はい。友達に聞いてみましょうgit bisectバグを修正したリビジョン:

git bisect start
git bisect bad last
git bisect good master

しかし、それはうまくいきません:

いくつかの良いrevは悪いrevの祖先ではありません。
この場合、git bisectは正しく機能しません。
たぶんあなたは良い回転と悪い回転を間違えますか?

これを克服するためのヒントはありますか?ドキュメントで何かを見逃しましたか?

88
eckes

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 適切に。

90
Michael Wolf

私は単にgitを「だまし」、良い<=>悪いの意味を交換します。

言い換えると、「不良」を問題のないものと見なして、パッチのベースとなる「適切な」バージョンではないようにします。

とにかく、かなり主観的な概念が良い点と悪い点ですよね? :)

git bisect start
git bisect good last
git bisect bad master
47
inger

私がPerlのproveコマンド(自動テストを実行する)で行っているようにgit bisect runを使用している場合、goodbadを交換するだけのチャンスはありません。 。テストの成功は、終了コードとして報告されます。

git bisect runによって実行されるプログラムの終了コードを無効にする有効なBash構文を見つけました。

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"

passproveによって実行されたテストの最初のリビジョンが得られました。

20
Daniel Böhmer

Gitでは、最初に定義することなく、oldnewを使用できるようになりました。追加の引数としてコミットせずにgit bisect startを呼び出す必要があります。次に、

git bisect old <rev>
git bisect new <rev>

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

これは基本的に、@ MarcHが実装する必要があると示唆していたことです。

8
GKFX

Gitエイリアスは良い考えですが、用語fixedunfixedにはgoodbadと同じ問題があります。これらと互換性を持つことはできません- 両方回帰と進行。どちらの方法でも機能する単語を見つけるのは簡単です。何が良いか悪いかという先入観のない、本質的に中立的な元のバイナリ検索用語から単純にピックアップします。例えば:

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/

6
MarcH