2011-12-20 5 views
18

2つの差分またはパッチが同等かどうかをテストする方法はありますか?2つの差分またはパッチを比較する方法はありますか?

のは、あなたがFとGがEにきれいにrebaseableあります場合は、次のgitのコミット履歴があるとしましょう:私たちの現在の展開プロセスで

 G 
    /
A--B--C--D--E 
\ 
    F 

によりに制限、我々は多少関連する、以下のきグラフ(それは制御されたバージョンではない)

   G' 
      /
------------E' 
      \ 
       F' 

F「及びG」が最終的にいくつか決定するために、ヘッドE」に適用されるので、

ように終わるだろう
------------E'--G'--F' 

E 'からG'へのdiffがGからのGitのコミットによって生成されたパッチと同じであることをテストする方法はありますか?

理想的な世界では、改訂管理がこれを解決し、そこに到達していることを完全に認識していますが、それは現在のところではありません。

本質的に、両方のパッチを別々のチェックアウトで再生して出力を比較することはできますが、それはちょっとしたものです。そして、diff自体を比較すると、行番号が変わる可能性があるので、私はうまくいきません。 G 'とF'がE 'にリベースされたとしても、最終的にF'のパッチがG 'に適用され、パッチのdiffコンテキストが異なります。

+2

diffの差分を試しましたか? – Geoffroy

+0

Gnu diffには、diffを生成する際に無視される行の正規表現を指定するためのコマンドラインスイッチがあります。 – holygeek

+0

バッチの場合、 'git patch-id'と' git cherry'(gitログの '--cherry *'オプションも参照)が高速回答として使われるかもしれませんが、それは厳しく、マイナーチェンジを重要と考えることができます。差分の差分は、あなたが特定の答えが必要なときに行く方法です – max630

答えて

1

私はちょうどgit試してみようと見ること:読者の利益のために

git checkout E -b FG 
git cherry-pick F' G' 
git checkout E -b GF 
git cherry-pick G' F' 
git diff FG GF 
git branch -D FG GF 
+0

"プライム"コミットはバージョン管理ではありません。彼らは実際にコミットされているわけではなく、実際のコミットEとFに基づいたパッチです。しかし、他のデータ(これは私がテストしているもの)で汚染されているかもしれません。 –

+0

パッチを適用するだけでいいですか? diffはdiffされませんが、gitは本当にうまくいきます。たぶん、ハンマー/爪の状況ですが、私はそれがうまくいくと確信しています。 :) – dahlbyk

+0

「パッチを適用するだけでいいですか?」とはどういう意味ですか?私は2つの差分を持っており、同等であればパッチを適用したいだけです。そうでない場合は、パッチを適用しないでください。 –

23
diff <(git show COMMIT1SHA) <(git show COMMIT2SHA) 
+2

これがどのように質問に答えるかについていくつかの文脈を追加できますか? – Chrismas007

+1

2つの差分(この場合は2つの異なるコミットの差分)を比較(差分)します。 – mrbrdo

+1

コミットの実際の変更と、コミットのメタデータ(sha、author、date、commitメッセージなど)を比較します。 私はこれを使って別々のブランチにある2つのコミットが同じ変更を導入しているかどうかを確認しました。チェリーピックにどちらかを使うことができます。 –

0

を、ここで少し微調整してthe answer of @mrbrdoへのアップデートは次のとおりです。

  • git sdiffエイリアスを追加しますこれに簡単にアクセスできます。 sdiffshow diffを表します。
  • 接尾辞^{}を使用する注釈付きタグヘッダーを無視します。
  • -uのように使用するdiffオプションなど

実行すると、あなたがgitを使用しているアカウントのそれぞれで、この許可:

git config --global alias.sdiff '!'"bash -c 'O=(); A=(); while x=\"\$1\"; shift; do case \$x in -*) O+=(\"\$x\");; *) A+=(\"\$x^{}\");; esac; done; g(){ git show \"\${A[\$1]}\" && return; echo FAIL \${A[\$1]}; git show \"\${A[\$2]}\"; }; diff \"\${O[@]}\" <(g 0 1) <(g 1 0)' --" 

その後あなたがこの使用することができます。

git sdiff F G 

これは、bashバージョン3以上が必要です。

を説明:

  • git config --global alias.sdiffがグローバル~/.gitconfiggit sdiffという別名を追加します。

  • !

    は、シェルコマンドとしてエイリアスを実行します

  • bash -c我々はbash(またはksh)、<(..)としてdash(別名。/bin/sh)では動作しません必要があります。

  • O=(); A=(); while x="$1"; shift; do case $x in -*) O+=("$x");; *) A+=("$x^{}");; esac; done;は、オプション(-something)と引数(その他すべて)を区切ります。オプションの配列はOで、引数の配列はAです。すべての引数には^{}が添付されているため、注釈をスキップします(注釈付きタグを使用できるように)。

  • g(){ git show "${A[$1]}" && return; echo FAIL ${A[$1]}; git show "${A[$2]}"; };は、最初の引数に対してgit showを実行するヘルパ関数を作成します。それが失敗すると、 "FAIL first-argument"を出力し、2番目の引数を出力します。これは何かが失敗した場合のオーバーヘッドを減らすためのトリックです。 (適切なエラー経営管理論が多すぎるであろう。)第一引数と第二引数に対して与えられたオプションと

  • diff "${O[@]}" <(g 0 1) <(g 1 0)ランdiff(とは、他の引数に失敗エラーフォールバックがdiffを低減するために、前記しました)。

  • --は、このエイリアス/スクリプトにdiff -options(-something)を渡すことを許可します。

バグ:引数の

  • 番号がチェックされません。第2引数の後ろにあるものはすべて無視され、少なすぎる場合はFAILと表示されます。

  • エラーはちょっと変になり、出力が乱雑になります。これが気に入らない場合は、2>/dev/nullで実行してください(またはスクリプトを適切に変更してください)。

  • 何かが壊れてもエラーは返されません。

  • デフォルトでは、これをページャーに送りたいと思うかもしれません。

のように、いくつかのより多くの別名を定義することは容易であることに注意してください:私はこれをさらに説明する必要はありません願ってい

git config --global alias.udiff '!git sdiff -u' 
git config --global alias.bdiff '!git sdiff -b' 

git config --global alias.pager '!pager() { cd "$GIT_PREFIX" && git -c color.status=always -c color.ui=always "[email protected]" 2>&1 | less -XFR; }; pager' 
git config --global alias.ddiff '!git pager udiff' 

このような別名の場合は、おそらく一見してmy GitHub repo

関連する問題