マージ diff を含むいくつかの特別なケース ( を使用できる場合) を除いて--combined、コミット diff は常にペアワイズです。これにより、x..y解釈される方法が変わります。yこの意味は、「から到達可能で、そこから到達できないすべてのリビジョン」という意味ではなく、「リビジョンとリビジョンをx比較する」という意味です。xy
(ここで、リンクされた質問の回答は、他の git コマンドx..yとは異なる方法で解釈されるという事実を覆い隠していることに注意してください。)git diff
を要求するとE..topic、git はtopic特定のコミット (この場合) に解決し、Kのツリーと のツリーを比較しEますK。Gとからの変更が表示されるのはそのためです。これらの変更はマージIによってもたらされたからです。J
Fとを比較することもできますが、これらの変更は実際には にあるため、KこれでもGとの変更が表示されます。IJ
実際、そのようにそのままJ維持しながら何が起こったのかを無視する唯一の方法があります。それは、それをスキップするか、元に戻すツリーを構築することです。たとえば、 から開始して、との間の差分に基づいてパッチを追加できます。FHHJK
K' <-- HEAD[detached]
/
B---D---F---H---J---K <-- topic
/ / /
A---C---E---G---I <-- master
(これを行うにはgit checkout topic~2、 commitHでdetach してから、現在の detached に からへの変更git cherry-pick topicを追加します)。HEADJK
Eこれで、コミット中のツリーとHEAD(コミット時K')のツリーを比較できます。
git diff E HEAD # or git diff E..HEAD or git diff E..
しかし、それは一般的に、人々がレビューしたいものではありません. 実際、後で rev をK'完全に放棄する (レビュー目的でのみ生成する) ことはほぼ確実であるため、彼らは一度も使用されていないバージョンのコードをレビューすることになります!
これが、リンクされた質問に対する受け入れられた答えが単に— とまったく同じである理由です。この場合、 のツリーとのツリーを比較します。のようなツリーをブランチ に送信することを提案しています。それが に入るコードです。の revにあるコードとは多少の違いがあります。それがしなければならない違いは、 、、 、および適合させるために行われたシム作業の合計です。 で行われた変更(およびもちろんそれ自体) がありますが、それらはへの変更ではありません。git diff master..topicgit diff master topicIKtopicKtopicImasterIFHKJGI I、それらは単に に組み込まれ Iた変更です。
コードをレビューするより徹底的な方法は、レビュー用に 4 つの差分を提示することです。
E対F
F対H
Hvs J(おそらく複合 diff、H-and- Ivs J)
J対K
最初の diff は、レビュアーに、彼らがそれを受け入れれば、次のようなツリーをチェックアウトできるようになることを伝えていますF(これは確かに真実です。ただgit checkout F)。2 番目の diff は、レビュアーに、レポがあれば、(彼らがそれを受け入れれば)Fチェックアウトできるようになることなどを伝えます。明らかに、4 つのレビューは 1つよりも難しいです。HIK