現在のブランチとマスターのGit diffですが、マージされていないマスターコミットは含まれません


171

まだマスターにマージされていないブランチのすべての変更の差分が必要です。

私は試した:

git diff master
git diff branch..master
git diff branch...master

ただし、これらのいずれの場合でも、diffには、まだ私のブランチにマージされていないマスターのコンテンツが含まれています。

ブランチにマージされていないマスターの変更を除外して、ブランチとマスターの間に差分をとる方法はありますか?


9
2番目のバージョンをめくると、必要なものが得られますgit diff master..branchgit diff master..ブランチにいる場合は、に短縮できます。r1..r2以下のための構文は短く、^r1 r2手段は「から下降することを私にすべてを示しているr2とはから到達可能ではありませんr1」。 git help gitrevisions使用できるさまざまな構文についての情報があります。
John Szakmeister 2013

1
...構文についての詳細を読んだ後、答えを広げましたgit diff。@jszakmeisterのコメントは間違っgitrevisionsていますgit diff。「」で説明されているリビジョン範囲はとは関係がないためです。Diffは履歴の2つのポイントを比較するため、範囲を処理できません。
Palec 2014

あなたは正しいです。git diff他のコマンドとは動作が異なることをいつも忘れています...苛立たしい事実です。:-(
John Szakmeister 14

比較する前に、masterのローカルコピーを必ず更新してください
joe

回答:


232
git diff `git merge-base master branch`..branch

マージベースは、branchから分岐したポイントmasterです。

Git diffはこのための特別な構文をサポートしています:

git diff master...branch

他のブランチを取得するため、サイドを入れ替えないでください。branchから分岐してから何が変わったかを知りたいのですがmaster、逆ではありません。

ゆるく関連:


.....構文のセマンティクスは他のGitツールと同じではないことに注意してください。で指定した意味とは異なりますman gitrevisions

引用man git-diff

  • git diff [--options] <commit> <commit> [--] [<path>…]

    これは、任意の2つの間の変更を表示するためのもの<commit>です。

  • git diff [--options] <commit>..<commit> [--] [<path>…]

    これは前のフォームと同義です。一方<commit>を省略すると、HEAD代わりにを使用するのと同じ効果があります。

  • git diff [--options] <commit>...<commit> [--] [<path>…]

    このフォームは<commit>、両方の共通の祖先から始まり、2番目までのブランチの変更を表示するためのもの<commit>です。「git diff A...B」は「」と同等git diff $(git-merge-base A B) Bです。のいずれかを省略できます<commit>。これは、HEAD代わりにを使用するのと同じ効果があります。

何かエキゾチックなことをしている場合に備えて、<commit>「..」表記を使用する最後の2つの形式を除いて、上記の説明のすべてがであることに注意してください<tree>

スペルのより完全なリストについては、の<commit>「改訂の指定」セクションを参照してくださいgitrevisions[7]。ただし、「diff」は2つのエンドポイントを比較することであり、範囲ではありません。範囲の表記( " <commit>..<commit>"および " <commit>...<commit>")は、の「SPECIFYING RANGES」セクションで定義されている範囲を意味しませんgitrevisions[7]


私が$ git diff master...branch作成したものfatal: ambiguous argument 'master...branch': unknown revision or path not in the working tree.-これはバージョンに依存するコマンドですか?
Joel Peltonen

実際、「ブランチ」はブランチの名前でなければならないことに気づきました。それは現在のブランチへの参照であると思いました
Joel Peltonen

4
正解branchです。私の答えは、呼び出されるブランチに依存しています。OPが質問で選択した名前をそのまま使用することにしました。あなたが現在のブランチを使用したい場合は、交換してくださいbranchHEAD
Palec 2016

14
を使用git diff master...して、ブランチの指定を回避できることに注意してください(現在のブランチが使用されます)。
VasiliNovikov 16

1
devel@ChrisGuest をチェックアウトした後、元のコマンドは機能しますか?おそらく、Gitはチェックアウト時にリモートブランチのローカルコピーとしてブランチを作成しました(通常はorigin/devel)。その場合はgit diff origin/devel...bugfix/API-353-api-allows-database-access-when、チェックアウト前でも機能していたでしょう。
Palec 2017

44

これが私のために働いたものです:

git diff origin/master...

これは、現在選択されているローカルブランチとリモートマスターブランチの間の変更のみを表示し、マージコミットからのローカルブランチのすべての変更を無視します。


参考までに、これらの変更を含むコミットのコミット参照が必要な場合は、を使用してくださいgit cherry origin/master
jaytibann

これが予想master外の大量のゴミを示している場合は、一連のコミットがリベースされている可能性があります。
マイケル-クレイシャーキーはどこですか

21

John SzakmeisterとVasiliNovikovによっても指摘されているように、ブランチのマスターの観点から完全な差分を取得するための最短のコマンドは次のとおりです。

git diff master...

これはマスターのローカルコピーを使用します。

特定のファイルの使用を比較するには:

git diff master... filepath

出力例:

使用例

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.