web-dev-qa-db-ja.com

現在のブランチとマスターの間のGit diff(マージされていないマスターコミットは含まない)

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

私は試した:

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

ただし、これらの各ケースでは、diffにはmasterのコンテンツが含まれていますが、それはまだ私のブランチにマージされていません。

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

125
pillarOfLight
git diff `git merge-base master branch`..branch

Merge basebranchname__がmastername__から分岐した点です。

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

git diff master...branch

あなたは辺を入れ替えてはいけません、それであなたは他の枝を手に入れるでしょう。 branchname__から何が変わったのか知りたいのですが、mastername__とは異なっていました。

ゆるい関係:


..および...構文は他のGitツールと同じ意味を持たないことに注意してください。 man gitrevisionsで指定されている意味とは異なります。

引用 man git-diff

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

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

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

    これは前の形式と同義です。片側の<commit>が省略された場合、代わりにHEADname__を使用するのと同じ効果があります。

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

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

珍しいことをしているのであれば、 ".."表記を使う最後の2つの形式を除いて、上記の説明の中のすべての<commit>はどんな<tree>でも構いません。

<commit>をつづる方法のより完全なリストについては、 gitrevisions[7] の「リビジョンの指定」セクションを参照してください。ただし、 "diff"は範囲ではなく2つの端点を比較するためのもので、範囲表記( "<commit>..<commit>"と "<commit>...<commit>")は gitrevisions[7] の "SPECIFYING RANGES"セクションで定義されている範囲を意味しません。

169
Palec

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

git diff Origin/master...

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

19
Jeshurun

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

git diff master...

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

出力例:

Example usage

4