一般的なケースでは、実際にはすべてのコミットを調べる必要があります。これは、あるコミットに大きな差分があり、次の小さな差分、次に別の大きな差分、中程度の差分があるかどうかを知る方法がないためです...
あなたの最善の策は、おそらく特定のファイルに限定することでしょう。単一のファイルだけを検討する場合、そのファイルのすべてのバージョンを反復処理するのにそれほど時間はかかりません (git rev-list <path>
リストを取得するために使用すると、すべてのコミットをテストする必要がなくなります)。ファイルを変更したコミットごとに、差分のサイズを確認し、最小値をすぐに見つけることができます。少数のファイルに対してこれを行います。うまくいけば、彼らは同意するでしょう!
差分を設定する最善の方法は、単純に tarball にコピーして一時的なコミットを作成することです。これにより、ブランチを呼び出しtarball
て比較することができます。そうすれば、これを行うことができます:
git rev-list path/to/file | while read hash; do echo -n "$hash "; git diff --numstat tarball $hash path/to/file; done
すべてのコミットと差分サイズの素敵なリストを取得します (最初の 3 列は SHA1、追加された行数、削除された行数になります)。次に、それを にパイプするだけでawk '{print $1,$2+$3}' | sort -n -k 2
、コミットとその差分サイズのソートされたリストが得られます!
テストするファイルを少数に限定できない場合は、次のようなものを手動で実装したくなるかもしれませんgit-bisect
。最良のケースでは、差分も小さくなり、それから遠く離れたコミットでは差分が大きくなります。(ニュートンの方法と完全なバイナリ/グリッド検索の間のどこかでしょうか?)
編集:ダグラスの回答で提案されている別の可能性は、一部のファイルが一部のコミットのファイルと同一である可能性があると思われる場合は、 を使用してそれらをハッシュしgit-hash-object
、履歴内のどのコミットにそのブロブがあるかを確認することです。それを行う方法についてのいくつかの優れた回答を含む質問があります。少数のファイル (できれば頻繁に変更されたファイル) でこれを行うと、対象のコミットをかなり迅速に絞り込むことができる場合があります。