2013-03-14 7 views
62

私は次のような問題があります。最初のGOODコミットを見つけるためにgit bisectを使用するにはどうすればよいですか?

  • masterのバージョンはmaster(たとえばlast)の前に細かい
  • 最後のタグのバージョンで動作しますが、同僚が彼のlast修正のパッチを必要とするバグ
  • を持っていますその特定のバグについて

いいえ。のは、バグを修正改正のための私たちの友人git bisectを聞いてみよう:

git bisect start 
git bisect bad last 
git bisect good master 

しかし、それは仕事に行くのではないです:

いくつかの良い回転域が悪いREVの祖先ではありません。
git bisectはこの場合正しく動作しません。
あなたは良い回転と悪い回転を間違えたかもしれませんか?

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

+1

私は二等分を自動化するために 'git bisect run ...'を実行しています。だから私は「良い」と「悪い」(それはあまりにも明白だった)という言葉を交換するだけのチャンスがありません。最初の良いリビジョンを見つけるために 'run'を使うには? –

+0

@DanielBöhmer:あなたのスクリプトの中で言葉**をスワップする必要があります**実行されていますか? – eckes

+0

'git bisect run'によって実行されるスクリプトは、文字列ではなく、終了コードとして* good *または* bad *を返します。私はちょうど以下に投稿した答えを見てください。 –

答えて

56

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を言います。

+3

さて、gitではサブコマンドのエイリアスを作成することはできません。したがって、ダッシュ。実際に(または可能になった)場合、誰かが答えを更新することを願っています。 –

+0

コマンドラインで: 'git config --global alias.bisect-broken 'bisect good''と' git config --global alias.bisect-fixed' bisect bad'' –

+1

エイリアスを使用しても、gitの出力それで、それはまだfooが最初の悪いコミットだと報告するので、一時的な訓練はまだ必要であると思われますか? – ThomasW

43

私はちょうど良い "の意味とスワップの意味を入れようとします< =>悪いです。

つまり、問題を示さないものとして「悪い」と考えてください。そうすれば、これはあなたのパッチのベースとなる「良い」バージョンではありません。

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

git bisect start 
git bisect good last 
git bisect bad master 
+5

が動作しますが、それはあなたの心をひねります:-) – eckes

+2

あなたはそれについて考えるならば、良いか悪いかは(おそらく宗教でさえない)一般的な意味はありません。これは実際には不正行為ではありませんが、おそらくGitの罪(宗教的な話題にとどまること:Dはより中立的な "目標"/"起源"よりもむしろそのような論点を拾うことです。)しかし、哲学は、 boggling ;-) – inger

+3

私はこの答えが大好きです。 – patrickvacek

5

Gitの別名は、しかし、用語fixedunfixedgoodbadよりも同じ問題を持って、良いアイデアです:あなたがそれらを両方回帰や進行と互換性があることはできません。どちらの方法でも動作する単語を見つけるのは簡単です。元のバイナリ検索用語から取り除くだけです。本質的に中立であり、良いか悪いかの先入観はありません。例えば:あなたは常に入力することができ、これらのような中立的用語で

git config --global alias.bisect-high 'bisect bad' 
git config --global alias.bisect-low 'bisect good' 

:(!またはgit bisect-upper、またはgit-bisect max、...あなたの選択)git bisect-highあなたは回帰や修正を探しているかどうか。

git bisectの開発者は、既存の用語を単純に再利用することはできませんでした。 http://stevebennett.me/2012/02/24/10-things-i-hate-about-git/

+0

投稿者:http://git.github.io/rev_news/2015/07/08/edition-5/ "git bisectが良いか悪いかの代わりに任意の組の用語を使用できるようにするために、いくつかのパッチシリーズが洗練されています。 .. " – MarcH

14

を私はあなただけのgoodbadを交換する機会を持っていません(自動テストを実行する)Perlのproveコマンドでやっているようにあなたがgit bisect runを使用している場合:ユーザー・インターフェースは、一般的に言えばgitのの問題ではありません。テストの成功は終了コードとして報告されます。私は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によって実行テストに私の最初のリビジョンを与えました。

+2

これは受け入れられた答えでなければなりません! –

+0

私は同意します。私はテストケースを修正するのではなく、これが完璧です。 – seanlinsley

5

Gitでは、最初にoldnewを使用することができます。さらに引数をコミットすることなく、あなたがgit bisect startを呼び出す必要があり、その後、適切にこれは、本質的に@MarcHを実装する必要があります示唆されたものである

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

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

を呼び出すことにより、二分を開始します。

関連する問題