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


90

次の問題があります。

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

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

git bisect start
git bisect bad last
git bisect good master

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

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

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


1
私はgit bisect run ...二等分を自動化するために走っています。私はチャンスを持っていないので、言葉だけ交換するgoodbad(あまりにも明白でした)。を使用runして最初の適切なリビジョンを見つける方法は?
DanielBöhmer2016年

@DanielBöhmer:実行中のスクリプト内の用語を交換する必要がありますね。
eckes

によって実行されるスクリプトは、文字列としてではなく、終了コードとして良い悪いかをgit bisect run返します。以下に投稿した私の回答をご覧ください。
DanielBöhmer2016年

@DanielBöhmer:まあ、その場合は、戻りコードを反転する必要がありますね。
eckes

正解です。それが私の回答に記載されています。
DanielBöhmer2016年

回答:


98

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に応じて言います。


5
余談ですが、gitではサブコマンドのエイリアスを作成できません。したがって、ダッシュ。それが実際に可能である(または可能である)場合、うまくいけば誰かが答えを更新します。
マイケルウルフ

3
エイリアスを使用しても、gitからの出力は使用されないため、引き続きfooが報告is the first bad commitされるため、一時的なトレーニングがまだ必要であるようです。
ThomasW

2
フェアポイント。(あなたのコメントを賛成しました。)それでもうまくいけば、対処する追加の認知的負荷は少なくとも少しは少なくなりますが、プログラマーとしてはすでに十分です。
マイケルウルフ

1
「前」と「後」のエイリアスを使用することをお勧めします。そうすれば、「バグを見つけたら、 'good'と書くべきです」という逆転を行うことによる認知的なオーバーヘッドがありません。代わりに、バグの出現/消失を探していることを思い出す(つまり、「何を」の前にどのような変更を探しているのかを思い出す)オーバーヘッドが(おそらく小さい)だけです。
JonasKölker、2017年

1
@JonasKölker、それは素晴らしいアイデアです。私は答えで提案エイリアスを使用し、同様にbisect-after = bisect badしてbisect-before = bisect good、あなたの推薦ごとに、。これで、どちらのエイリアスセットも使用できます。何回か使用した後、どちらを優先するかがわかります。
ガブリエルステープルズ

47

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

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

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

git bisect start
git bisect good last
git bisect bad master

2
まあ、あなたがそれについて考えるなら、良いか悪いかは何かについての一般的な意味はありません(おそらく宗教においてさえです)。それは単にあなたの目的に依存します。このように、それは実際には不正行為ではありませんが、おそらくGit's Sin(宗教的なトピックに留まるために:Dは、より中立的な「目標」/「起源」ではなく、そのような論争の的である用語を取り上げることです。
ボグリング

バグが「良い」ものであると聞いたのは、これが初めてのことです。
MarcH 2015

1
それがこの質問を見つける前に私がやったことです。もうやらない。全体の二分法が失敗する前に、それはただ一つの間違った答えをとることを覚えておいてください。あなたの心をねじらないでください。
プロスキー2017

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"

これにより、実行したテストに合格する最初のリビジョンが得られましたprove


同意します。テストケースを変更したくないので、これは完璧です。
seanlinsley 2017年

8

Gitを使用するoldnew、最初に定義することなく使用できます。あなたはgit bisect startさらなる引数としてコミットなしで呼び出す必要があり、それから呼び出しによって二分法を適切に開始します

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

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

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


1
これが最も適切な答えです(最新のgitの場合)。開始コマンドは次のようにする必要があります(共有されたリンクに従って):git bisect start --term-new fixed --term-old broken
Sam Protsenko

そうだね。これらのオプションはいつ導入されましたか?回答を更新したいのですが。
マイケルウルフ

@MichaelWolf バージョン2.7.0で登場しました。
GKFX 2018年

6

Gitエイリアスは良いアイデアですが、用語fixedとにunfixedはandと同じ問題が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/


From:git.github.io/rev_news/2015/07/08/edition-5「一部のパッチシリーズは、git bisectが善と悪の代わりに任意の用語のペアを使用できるように改良されています...」
MarcH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.