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