Git では、たとえば git コマンドの diff と difftool を使用して、コミット間の違いを非常に簡単に比較できます。また、TortoiseGit では、2 つのコミットを選択して比較します。
しかし、変更セットを比較する方法はありますか? つまり、あるコミット セットの差分と別のコミット セットの差分との違いを確認することです。
これは、チェリーピックまたはリベースされたコミット (のセット) を比較するのに非常に便利です。
Git では、たとえば git コマンドの diff と difftool を使用して、コミット間の違いを非常に簡単に比較できます。また、TortoiseGit では、2 つのコミットを選択して比較します。
しかし、変更セットを比較する方法はありますか? つまり、あるコミット セットの差分と別のコミット セットの差分との違いを確認することです。
これは、チェリーピックまたはリベースされたコミット (のセット) を比較するのに非常に便利です。
おそらくdiff <(git show rev1) <(git show rev2)
あなたが望むことをしますか?
一般に、必要なものを取得するには、比較するものを作成するために、何らかのマージ/リベース操作を行う必要があると思います。
よく考えてみると、チェンジセット間の差分という考えはあいまいです。ここでは、次のような状況にあると想定しています。
[other history] [ "changeset 1" ]
o - o - o - o - o ( - o - o - o - o)
\
(o - o - o - o - o)
[ "changeset 2" ]
では、この 2 つを比較することに何の意味があるのでしょうか。おそらくあなたの場合、他の履歴の差分は 2 つの変更セットの差分とは完全に切り離されていますが、一般的に、変更セット 1 の内容はその他の履歴に依存している可能性があります。これは、git がこのような操作を実行するための適切な一般的な方法がないことを意味します。適切に行うには、基本的に「リベースした場合、2 つの終了コミットの違いは何になるでしょうか?」と言う必要があります。つまり、唯一の合理的な定義は変更セット間の差分の は、共通の祖先を持つようにリベースされた場合の結果の終了コミット間の差分です。もちろん、それが必要な場合は、作業ツリーで操作を実行する必要があります。このような差分をいじる方法は他にありません。行うべき明らかなことは、リベースして、新しいエンドポイント (ブランチ) を比較することです。
[other history] [ "changeset 1" ]
o - o - o - o - o ( - o - o - o - o)
\
(o - o - o - o - o)
[ "changeset 2'" ]
ただし、リベースが常に最も楽しいとは限りません。競合を適切に解決すると仮定すると、リベースの結果の作業ツリーは、マージの結果と同じになるはずです。
[other history] [ "changeset 1" ]
o - o - o - o - o ( - o - o - o - o)
\ \
\ ------
\ \
(o - o - o - o - o) - X
[ "changeset 2" ]
したがって、その一時的なマージを実行し、結果のコミットを他の変更セットの最後のコミットと比較できます。これは、リベースを行うよりもはるかに高速です。(どちらにしても、もちろん、変更セット 2 の実際のブランチではなく、使い捨てのブランチを使用します。)
2つの変更セットを比較するために私が働いたのは次のとおりです。
git diff [base_sha_a]..[final_sha_a] > ./a.diff
git diff [base_sha_b]..[final_sha_b] > ./b.diff
diff ./a.diff ./b.diff
コマンドの結果diff
が空の場合、変更セットは同じです。それ以外の場合は、2 つの差分の違いが表示されます。
jeff-bradberryの回答を拡張する:
2 つの単一コミットによって導入された変更セットを比較するには:
diff <(git show -U0 <sha-A>) <(git show -U0 <sha-B>)
コミットの 2 つのシーケンスによって導入された変更セットを比較するには、次のようにします。
diff <(git show -U0 <sha-A>...<sha-B>) <(git show -U0 <sha-C>...<sha-D>)
注:-U0
は、「コンテキスト」行 (つまり、編集によって直接変更された行ではなく、変更された行) の比較を避けるためのものです。
git diff end_rev_1...end_rev_2
出典: http://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html
同様の表記 r1...r2 は r1 と r2 の対称差と呼ばれ、$(git merge-base --all r1 r2) ではなく r1 r2 -- として定義されます。これは、r1 または r2 のいずれか一方から到達可能ですが、両方から到達可能ではない一連のコミットです。
そして git diff ヘルプから:
git diff [--options] <commit>...<commit> [--] [<path>...]
This form is to view the changes on the branch containing and up to the second <commit>, starting at a
common ancestor of both <commit>. "git diff A...B" is equivalent to "git diff $(git-merge-base A B) B".
You can omit any one of <commit>, which has the same effect as using HEAD instead.
それはあなたのために働きますか?