2つの異なるブランチのファイルを比較する方法は?


1538

あるブランチでは問題なく機能し、別のブランチでは機能しないスクリプトがあります。2つのバージョンを並べて見て、何が違うのかを確認したいと思います。これを行う方法はありますか?

明確にするために、私は比較ツールを探していません(Beyond Compareを使用しています)。マスターバージョンを現在のブランチバージョンと比較して何が変更されたかを確認できるgit diffコマンドを探しています。私は合併などの最中ではありません。ただ言いたいだけです

git diff mybranch/myfile.cs master/myfile.cs

回答:


2208

git diff 2つのコミットの違いを示すことができます:

git diff mybranch master -- myfile.cs

または、同等に:

git diff mybranch..master -- myfile.cs

いずれの側である場合には、後者の構文を使用してHEAD、それが省略されてもよい(例えば、master..比較masterしますHEAD)。

興味があるかもしれませんmybranch...mastergit diffdocsから):

このフォームは<commit>、両方の共通の祖先から始まり、2番目までのブランチの変更を表示するためのもの<commit>です。git diff A...Bと同等git diff $(git-merge-base A B) Bです。

言い換えると、これはmasterからの変更の差分を提供しますmybranch(ただし、からの新しい変更はありませんmybranch)。


すべての場合において、--ファイル名の前のセパレータは、コマンドラインフラグの終わりを示します。引数がコミットまたはファイルを参照する場合にGitが混乱しない限り、これはオプションですが、それを含めることは悪い習慣ではありません。いくつかの例については、https://stackoverflow.com/a/13321491/54249を参照してください


git difftool構成済みの場合、同じ引数を渡すことができます。


44
比較する2つのバージョンのどちらもワークツリーでない場合は、を使用できますgit diff branch1 branch2 myfile.cs。(--最大2つのリビジョン引数を取ることができるため、これはもう必要ありません。)
Cascabel

8
私はこれのすべてのバージョンを試しましたが、何も起こりません。私はdifftoolを構成しています(マージに機能します)。bd.ps1というファイルがあります。入力するコマンドのすべてのバージョンは何もしません。間違いさえしません。WTH!?!?!
Micah

3
@Micah:プレーンデフでも試してみませんか?現在のディレクトリからの相対パスを正しく入力していますか?(ファイルが存在しない場合は、何も表示されず、diffも表示されません。.を使用し--ます。よくある間違いは簡単です。)
Cascabel

5
git diff --name-status branch1..branch2(おそらく明白ですが、他の誰かが私と同じ問題を抱えている場合に備えて言及しておきたいと思います)のように、ファイルへの完全パスを含めない限り、これは私にとってはうまくいきませんでした。
hBrent 2013

4
mybranchとmasterの順序も重要です。最初のブランチのファイルは「-」プレフィックスで表示され、2番目のブランチのファイルは「+」プレフィックスで表示されます。
ティムボ2015

414

あなたはこれを行うことができます: git diff branch1:path/to/file branch2:path/to/file

difftoolを構成している場合は、次のこともできます。 git difftool branch1:path/to/file branch2:path/to/file

関連質問:ビジュアルdiffプログラムでgit diff出力を表示するにはどうすればよいです


4
コロンを使用するのはあまり良い方法ではありません。つまり、ツリーオブジェクトを介してファイルを参照しているため、現在のディレクトリからの相対パスではなく、完全なパスを入力する必要があります。
Cascabel 2010年

13
@Jefromi、これは最近のバージョンで変更されている可能性がありますが、少なくとも現在は相対パスを使用できます(例:)branch1:./file。これは、ファイルがブランチ間の別の場所にある場合にも役立ちます(例:)git diff branch1:old/path/to/file branch2:new/path/to/file
redbmk 2014年

4
@redbmkええ、それは2010年から現在までのいつかでした!それでも、両方のブランチで同じファイルである場合は、このようにする必要はありませんgit diff branch1 branch2 path/to/file
Cascabel 2014年

3
@jefromiかっこいい、いつ追加されたのかタイムラインがわからなかった。ええ、私は通常あなたが言及した構文を使いますが、ティムの答えは、それが実際に質問が求めていたものではなかったとしても、異なるパスでファイルを比較する方法を理解するのに役立ちました
redbmk

1
私はこのアイデアが大好きですが、この構文を機能させたり、git diff docsでそれについての言及を見つけることができません。何が欠けていますか?ありがとう!
yoyo

160

より現代的な構文:

git diff ..master path/to/file

二重ドットの接頭辞は、「現在の作業ディレクトリから」を意味します。次のように言うこともできます:

  • master..、つまり上記の逆。これはと同じmasterです。
  • mybranch..master、現在の作業ツリー以外の状態を明示的に参照します。
  • v2.0.1..masterつまり、タグを参照します。
  • [refspec]..[refspec]、基本的にはgitのコード状態として識別可能なもの。

33

2つの異なるブランチからのファイルを比較するには、多くの方法があります。

  • オプション1: n個の特定のブランチのファイルを別の特定のブランチと比較する場合:

    git diff branch1name branch2name path/to/file
    

    例:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs
    

    この例では、「mybranch」ブランチのファイルと「mysecondbranch」ブランチのファイルを比較しています。

  • オプション2:簡単な方法:

     git diff branch1:file branch2:file
    

    例:

     git diff mybranch:myfile.cs mysecondbranch:myfile.cs
    

    この例は、オプション1に似ています。

  • オプション3:現在の作業ディレクトリをいくつかのブランチと比較する場合:

    git diff ..someBranch path/to/file
    

    例:

    git diff ..master myfile.cs
    

    この例では、実際のブランチのファイルをマスターブランチのファイルと比較しています。


12

私は単にします git diff branch1 branch2 path/to/file

これにより、ファイル間の違いがチェックされます。の変更はbranch1赤で表示されます。の変更はbranch2緑色になります。

それbranch1が過去でありbranch2未来であると想定されています。差分のブランチの順序を逆にすることでこれを逆にすることができます:git diff branch2 branch1


git diffのどのバージョンがこれを行うことができますか?私が実行しているバージョン(2..9.2.windows.1)ではサポートされていないようです。
Vince Bowdren

9

現在のブランチとの差分を作成したい場合は、それを省略して使用できます。

git diff $BRANCH -- path/to/file

このようにして、現在のブランチから参照先のブランチ($BRANCH)に相違します。


5

@dahlbykによって提案された答えに同意します。コードレビューのためにdiffファイルにdiffを書き込む場合は、次のコマンドを使用します。

git diff branch master -- filepath/filename.extension > filename.diff --cached

2

私の場合、以下のコマンドを使用します。

git diff <branch name> -- <path + file name>

このコマンドは、2つの異なるブランチで同じファイルを比較するのに役立ちます


1

これを行う最良の方法git diffは、次の方法で使用することです。 git diff <source_branch> <target_branch> -- file_path

それらのブランチのファイル間の違いをチェックします。gitコマンド とその動作の詳細については、この記事をご覧ください。


1

このようにコミットハッシュを使用します:

git diff <hash1> <hash2> <filename>

どこHASH1は、任意の任意の支店、のために同じからコミットすることができますHASH2


1

ファイルを比較するシナリオは2つあります。

シナリオ1:リモートブランチでファイルを比較します(両方のブランチがリモートリポジトリに存在する必要があります)

シナリオ2:ローカルファイル(ローカル作業領域のコピー)とリモートリポジトリのファイルを比較します。

ロジックは簡単です。diffに2つのブランチ名を指定すると、常にリモートブランチが比較されます。ブランチ名を1つだけ指定すると、ローカルの作業コピーとリモートリポジトリ(指定したもの)が常に比較されます。範囲を使用して、リモートリポジトリを提供できます。

例:ブランチをチェックアウトする

git checkout branch1
git diff branch2 [filename]

この場合、ファイル名を指定すると、ファイル名のローカルコピーが「branch2」という名前のリモートブランチと比較されます。

git diff branch1 branch2 [filename]

この場合には、それは「という名前のリモートブランチからのファイル名を比較します支社」対「BRANCH2

git diff ..branch2 [filename]

この場合も、それは「という名前のリモートブランチからのファイル名を比較します支社」対「BRANCH2」。したがって、上記と同じです。ただし、別のブランチからブランチを作成したばかりで、「master」と言っていて、現在のブランチがリモートリポジトリに存在しない場合、リモート「マスター」とリモート「branch2」が比較されます。

その有用を願っています。


0

git bash内の2つのファイルを比較するには、次のコマンドを使用する必要があります。

git diff <Branch name>..master -- Filename.extension   

このコマンドは、bash自体の2つのファイルの違いを表示します。

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