git-diff

コマンド名

「git-diff」:コミット、コミットとワークツリーなどの間の変更を表示

概要

git diff [<options>] [<commit>] [–] [<path>…]
git diff [<options>] –cached [<commit>] [–] [<path>…]
git diff [<options>] <commit> [<commit>…] <commit> [–] [<path>…]
git diff [<options>] <commit>…<commit> [–] [<path>…]
git diff [<options>] <blob> <blob>
git diff [<options>] –no-index [–] <path> <path>

説明

ワークツリーとインデックスまたはツリー間の変更、インデックスとツリー間の変更、2つのツリー間の変更、マージによる変更、2つのブロブオブジェクト間の変更、またはディスク上の2つのファイル間の変更を表示します。

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

このフォームはインデックス(次のコミットのステージング領域)に関連して行った変更を表示するためのものです。言い換えれば、その違いはGitにインデックスをさらに追加するように指示できるものですが、まだ追加していないということです。git-add[1]を使用して、これらの変更をステージングできます。

git diff [<options>] --no-index [--] <path> <path>

このフォームはファイルシステム上の指定された2つのパスを比較するためのものです。Gitによってコントロールされるワークツリーでコマンドを実行し、パスの少なくとも1つがワークツリーの外側を示している場合、またはGitによってコントロールされるワークツリーの外側でコマンドを実行する場合、--no-indexオプションを省略することができます。このフォームは--exit-codeを示します。

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

このフォームは指定された<commit>に関連する次のコミットのためにステージングした変更を表示するためのものです。通常、最新のコミットとの比較が必要になるため、<commit>を指定しない場合、デフォルトでヘッドになります。ヘッドが存在せず(例えば、まだ存在しないブランチ)、<commit>が指定されていない場合、すべての変更が表示されます。--staged--cachedと同義語となります。

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

このフォームは指定された<commit>に関連してワークツリーに加えた変更を表示するためのものです。ヘッドを使用して最新のコミットと比較したり、ブランチ名を使用して別のブランチの末端と比較できます。

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

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

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

このフォームはマージコミットの結果を表示するためのものです。最初にリストされている<commit>はマージ自体である必要があります。残りの2つ以上のコミットはそのペアレントである必要があります。必要なリビジョンのセットを作成する便利な方法としては「^@ suffix」を使用することです。例えば、masterがマージコミットに名前を付ける場合、git diff master master^@git show masterと同じ結合されたdiffを与えます。

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

これは2つの任意の<commit>間の変更を表示するために、以前のフォーム(「..」なし)と同義となります。片側の<commit>を省略すると、代わりにヘッドを使用した場合と同じになります。

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

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

エキゾチックな何かに備えて、上記の説明のすべての<commit>は「..」表記を使用する最後の2つのフォームを除いて、任意の<tree>にすることができることに注意してください。

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

git diff [<options>] <blob> <blob>

このフォームは2つのブログオブジェクトの生のコンテンツの違いを表示するためのものです。

オプション

-p
-u
--patch

パッチを作成します(パッチの作成に関するセクションを参照)。これがデフォルトとなります。

-s
--no-patch

差分出力を抑制します。デフォルトでパッチを表示するgit showのようなコマンド、または–patchの効果をキャンセルする場合に便利です。

-U<n>
--unified=<n>

通常の3ラインではなく、<n>ラインのコンテキストで差分を生成します。–patchを意味します。-pを意味します。

--output=<file>

「Stdout」ではなく特定のファイルに出力します。

--output-indicator-new=<char>
--output-indicator-old=<char>
--output-indicator-context=<char>

作成されたパッチの新しいライン、古いライン、またはコンテキストラインを示すために使用される文字を指定します。通常、それらはそれぞれ「+」、「-」、および「 ”」となります。

--raw

生のフォームで差分を作成します。

--patch-with-raw

-p --rawの同義語です。

--indent-heuristic

差分ハンクの境界をシフトするヒューリスティックを有効にし、パッチを読みやすくします。これがデフォルトとなります。

--no-indent-heuristic

vインデントヒューリスティックを無効にします。

--minimal

可能な限り最小の差分が作成されるように、時間を使います。

--patience

「patience diff」アルゴリズムを使用して差分を作成します。

--histogram

Generate a diff using the “histogram diff” algorithm. 「histogram diff」アルゴリズムを使用して差分を作成します。

--anchored=<text>

「anchored diff」アルゴリズムを使用して差分を作成します。

このオプションは複数回指定できます。

ラインがソースと送り先の両方に存在し、1回だけ存在し、このテキストで始まる場合、このアルゴリズムはそのラインが出力に削除または追加として表示されないようにします。内部で「patience diff」アルゴリズムを使用します。

--diff-algorithm={patience|minimal|histogram|myers}

差分アルゴリズムを選択します。 バリアントは次のとおりです。

default, myers

基本のグリーディー差分アルゴリズムです。現在、これがデフォルトとなっています。

minimal

可能な限り最小の差分が作成されるように、時間を使います。

patience

パッチを作成する時、「patience diff」アルゴリズムを使用します。

histogram

このアルゴリズムはペイシェントアルゴリズムを「発生率の低い共通要素をサポー」へと拡張します。

例えば、diff.algorithm 変数をデフォルト以外の値に構成し、デフォルト値を使用する場合は--diff-algorithm=defaultオプションを使用する必要があります。

--stat[=<width>[,<name-width>[,<count>]]]

「diffstat」を作成します。デフォルトでは必要なだけのスペースがファイル名部分に使用され、残りはグラフ部分に使用されます。最大幅はデフォルトで端末幅、または端末に接続されていない場合は80列であり、<width>で上書きできます。ファイル名部分の幅はコンマの後に別の幅<name-width>を指定することで制限できます。グラフ部分の幅は--stat-graph-width=<width>(統計グラフを作成するすべてのコマンドに影響)を使用するか、diff.statGraphWidth=<width>git format-patchには影響しない)を設定することによって制限できます。3番目のパラメーター<count>を指定すると、出力を最初の<count>ラインに制限し、さらに存在する場合は…と続けることができます。

これらのパラメータは--stat-width=<width>--stat-name-width=<name-width> --stat-count=<count>を使用して個別に設定することもできます。

--compact-summary

ファイルの作成または削除(「新規」または「終了」、オプションでシンボリックリンクの場合は「+ l」)およびモード変更(追加または削除の場合は「+x」または「-x」)などの拡張ヘッダー情報の要約を出力します。情報はファイル名部分とグラフ部分の間に置かれます。--statを意味します。

--numstat

--statに似ていますが、追加および削除されたライン数を10進法表記で表示し、パス名を省略形なしで表示し、より機器にとって良いようにします。バイナリファイルの場合、0 0と言う代わりに2つの- を出力します。

--shortstat

変更されたファイルの総数と追加および削除されたラインの数を含む--stat フォーマットの最後のラインのみを出力します。

-X[<param1,param2,…>]
--dirstat[=<param1,param2,…>]

各サブディレクトリの相対的な変更量の分布を出力します。--dirstatの動作はパラメータのコンマ区切りリストをパスことでカスタマイズできます。デフォルトはdiff.dirstat構成変数によってコントロールされます(git-config[1]を参照)。次のパラメータが使用できます。

changes

ソースから削除されたまたは送り先に追加されたラインをカウントして、「dirstat」数を計算します。これはファイル内の純粋なコード移動の量を無視します。つまり、ファイル内のラインの再配置は他の変更ほどカウントされません。これはパラメーターが指定されていない場合のデフォルトの動作となっています。

lines

通常のラインベースの差分分析を実行し、削除もしくは追加されたライン数を合計し、「dirstat」数を計算します。(バイナリファイルの場合、バイナリファイルにはラインの自然な概念がないため、その代わりに64バイトのチャンクをカウントします)。これはchanges動作よりもコストのかかる--dirstat動作ですが、ファイル内の再配置されたラインを他の変更と同じようにカウントします。結果の出力は、他の--*statオプションから得られるものと一致しています。

files

変更されたファイルの数を数えて、「dirstat」の数を計算します。変更された各ファイルはdirstat分析で等しくカウントされます。これはファイルの内容をまったく調べる必要がないため、計算上最も安価な--dirstat動作です。

cumulative

ペアレントディレクトリのチャイルドディレクトリの変更もカウントします。累積を使用する場合、報告されるパーセンテージの合計が100%を超える場合があることに注意してください。デフォルト(非累積)動作はnoncumulativeパラメーターで指定できます。

<limit>

整数パラメーターはカットオフパーセント(デフォルトでは3%)を指定します。変更のこの割合より少ないディレクトリは出力に表示されません。

例:以下は変更されたファイルの合計量の10%未満のディレクトリを無視し、ペアレントディレクトリにチャイルドディレクトリの数を累積しながら、変更されたファイルである--dirstat=files,10,cumulativeをカウントします。

--cumulative

--dirstat = cumulativeの同義語です。

--dirstat-by-file[=<param1,param2>…]

--dirstat=files,param1,param2…の同義語です。

--summary

作成、名前変更、モード変更などの拡張ヘッダー情報の要約を出力します。

--patch-with-stat

-p –statと同義語です。

-z

--raw--numstat--name-only、もしくは--name-status が指定されている場合、パス名を変更せず、出力フィールドターミネータとしてNULを使用してください。
このオプションがないと、構成変数core.quotePathで説明されているように「異常な」文字を含むパス名が引用符で囲まれます(git-config[1]を参照)。

--name-only

変更されたファイルの名前のみを表示します。

--name-status

変更されたファイルの名前とステータスのみを表示します。ステータス文字の意味については--diff-filterオプションの説明を参照してください。

--submodule[=<format>]

サブモジュールの違いをどのように表示するかを指定します。--submodule=shortを指定すると短いフォーマットが使用されます。このフォーマットは範囲の最初と最後にコミットの名前を表示するだけです。--submoduleもしくは--submodule=log を指定すると、ログフォーマットが使用されます。このフォーマットは、git-submodule[1] summaryのように範囲内のコミットをリストします。--submodule=diffを指定すると、差分フォーマットが使用されます。このフォーマット形式はコミット範囲間のサブモジュールの内容の変更のインライン差分を示します。 構成オプションが設定されていない場合、デフォルトはdiff.submoduleまたは「short」フォーマットです。

--color[=<when>]

色が付いた差分を表示します。--color (つまり「= <when>」なし)は--color=alwaysと同じです。<when>はalwaysnever、もしくは autoのいずれかになります。これはcolor.uicolor.diff の構成設定によって変更できます。

--no-color

色が付いた差分をオフにします。これは構成設定を上書きするために使用できます。--color=neverと同じです。

--color-moved[=<mode>]

移動したコードのラインの色は異なります。これはdiff.colorMoved構成設定によって変更できます。<mode>はオプションが指定されていない場合、デフォルトで「no」になり、モードが指定されていない場合は「zebra」になります。モードは次のいずれかである必要があります。

no

移動したラインはハイライトされません。

default

zebraの同義語です。これは将来よりセンシブルなモードに変更される可能性があります。

plain

ある場所で追加され、別の場所で削除されたラインは「color.diff.newMoved」で色付けされます。 同様に「color.diff.oldMoved」は差分の別の場所に追加された削除されたラインに使用されます。このモードは移動されたラインをピックアップしますが、コードのブロックが順列なしで移動されたかどうかを判断するレビューにおいてはあまり役に立ちません。

blocks

少なくとも20文字の英数字の移動テキストのブロックが検出されます。検出されたブロックは「 color.diff.{old,new}Moved 」の色のいずれかを使用してペイントされます。隣接するブロックを区別することはできません。

zebra

移動したテキストのブロックはブロックモードの場合と同様に検出されます。ブロックは「color.diff.{old,new}Moved 」の色または「color.diff.{old,new}MovedAlternative」のいずれかを使用してペイントされます。2つの色の間の変化は新しいブロックが検出されたことを示します。

dimmed-zebra

「zebra」に似ていますが、移動されたコードに関係ない部分の追加のディミングが実行されます。 隣接する2つのブロックの境界線は関係すると見なされ、残りは関係するものではありません。dimmed_zebraは非推奨の同義語です。

--no-color-moved

移動検出をオフにします。これは構成設定を上書きするために使用されます。--color-moved=noと同じです。

--color-moved-ws=<modes>

これは--color-movedの移動検出を実行するときに空白を無視する方法を構成します。これはdiff.colorMovedWS構成設定によって設定できます。これらのモードはコンマ区切りのリストとして指定できます。

no

移動検出を実行する時、空白を無視しないでください。

ignore-space-at-eol

EOLで空白の変更を無視します。

ignore-space-change

空白の量の変更は無視してください。これはライン末端の空白を無視し、1つ以上の空白文字の他のすべてのシーケンスを同等と見なします。

ignore-all-space

ラインを比較するときは空白を無視します。これは一方のラインに空白があり、もう一方のラインに空白がない場合でも、その違いを無視します。

allow-indentation-change

最初に移動検出で空白を無視し、空白の変更がラインごとに同じである場合にのみ、移動されたコードブロックをブロックにグループ化します。これは他のモードと互換性がありません。

--no-color-moved-ws

移動検出を実行する時、空白を無視しないでください。これは構成設定を上書きするために使用できます--color-moved-ws=noと同じです。

--word-diff[=<mode>]

<mode>を使用して変更された単語を区切ることにより、単語の差分を表示します。デフォルトでは単語は空白で区切られます。以下の--word-diff-regexを参照してください。<mode>のデフォルトはプレーンであり、次のいずれかである必要があります。

color

色のみを使用して変更された単語をハイライトします。--colorを意味します。

plain

単語を[-removed-]{+added+}として表示します。区切り文字が入力に表示されている場合、区切り文字をエスケープしようとしないため、出力があいまいになる可能性があります。

porcelain

スクリプトの使用を目的とした特別なラインベースのフォーマットを使用します。追加/削除/変更されていないものは通常の統一された差分フォーマットで印刷され、ラインの先頭が「+」/「-」/「` `」文字で始まり、ラインの末端まで続きます。入力の改ラインはそれ自体のラインのチルダ~ で示されます。

none

単語の差分を再度無効にします。
最初のモードの名前にも関わらず、有効になっている場合、すべてのモードで変更された部分を強調するために色が使用されることに注意してください。

--word-diff-regex=<regex>

非空白の実行を単語と見なす代わりに<regex>を使用して単語が何であるかを決定します。また、有効になっていない限り、--word-diffを意味します。

<regex>の重複しない一致はすべて単語と見なされます。これらの一致の間のすべては空白と見なされ、違いを見つけるために無視されます。正規表現に|[^[:space:]]を追加して、空白以外のすべての文字と一致することを確認することをお勧めします。改ラインを含む一致は改ラインでサイレントに切り捨てられます。

例えば、--word-diff-regex=.です。各文字を単語として扱い、それに応じて、文字ごとの違いを示します。

正規表現は差分ドライバーまたは構成オプションを介して設定することもできます。gitattributes[5] もしくはgit-config[1]を参照してください。これを指定すると、差分ドライバーまたは構成設定が明示的に上書きされます。差分ドライバーは構成設定を上書きします。

--color-words[=<regex>]

--word-diff=color と(正規表現が指定されている場合)--word-diff-regex=<regex>と同等です。

--no-renames

構成ファイルにデフォルトで指定されている場合、名前変更の検出をオフにします。

--[no-]rename-empty

名前変更ソースとして空のブロブを使用するかどうか。

--check

変更によってコンフリクトマーカーまたは空白エラーが発生した場合に警告を行います。空白エラーと見なされるものはcore.whitespace構成によってコントロールされます。デフォルトでは末尾の空白(空白のみで構成されるラインを含む)とラインの最初のインデント内で直後にタブ文字が続くスペース文字は空白エラーと見なされます。問題が見つかった場合、ゼロ以外のステータスで終了します。「–exit-code」とは互換性がありません。

--ws-error-highlight=<kind>

context内の空白エラー、差分のoldもしくはnew ラインをハイライトします。複数の値はコンマで区切られ、noneは前の値をリセットし、defaultはリストをnewにリセットし、allは>old,new,contextの省略形です。このオプションが指定されておらず、構成変数diff.wsErrorHighlightが設定されていない場合、新しいラインの空白エラーのみがハイライトされます。空白エラーはcolor.diff.whitespaceで色分けされています。

--full-index

パッチフォーマットの出力を作成する時は最初のの文字の代わりに「インデックス」ラインにイメージ前およびイメージ後の完全なブロブオブジェクト名を表示します。

--binary

--full-indexに加えて、git-applyで適用できるバイナリ差分を出力します--patchを意味します。

--abbrev[=<n>]

40バイトのオブジェクト名全体を差分ローフォーマットの出力と差分ツリーヘッダーラインに表示する代わりに、部分的なプレフィックスのみを表示します。差分パッチ出力フォーマットでは--full-indexが優先されます。つまり--full-indexが指定されている場合、--abbrevに関係なく完全なブロブ名が表示されます。デフォルト以外の桁数は--abbrev=<n>で指定できます。

-B[<n>][/<m>]
--break-rewrites[=[<n>][/<m>]]

完全なリライト変更を削除と作成のペアに分割します。これには2つの目的があります。

これはファイルの完全な書き換えに相当する変更がコンテキストとしてテキストで一致する非常に少数のラインと混合された一連の削除と挿入としてではなく、古いものすべての単一の削除とそれに続くすべての新しいものを1回挿入し、数値mは-Bオプションのこの側面をコントロールします(デフォルトは60%)。-B/70%はGitがそれを完全な書き換えと見なすため、オリジナルの30%未満が結果に残る必要があることを指定します(つまり、結果のパッチはコンテキストラインと混合された一連の削除と挿入になります)。

-Mと一緒に使用する場合、完全に書き換えられたファイルも名前変更のソースと見なされ(通常、-Mは消えたファイルのみを名前変更のソースと見なします)、番号n は-Bオプションのこの側面をコントロールします(デフォルトは50%)。-B20%はファイルのサイズの20%以上と比較し、追加および削除を伴う変更が別のファイルへの名前変更の考えられるソースとして取得される資格があることを指定します。

-M[<n>]
--find-renames[=<n>]

名前の変更を検出します。n が指定されている場合、それは類似性インデックスの閾値です(つまり、ファイルのサイズと比較した追加/削除の総量)。例えば、-M90% はファイルの90%以上が変更されていない場合、Gitが削除と追加のペアを名前変更と見なす必要があることを意味します。%記号がない場合、数値は小数として読み取られ、その前に小数点が付きます。つまり、-M5は0.5になるため、--M50%と同じになります。同様に-M05-M5%と同じです。検出を正確な名前変更へとコントロールするには-M100%を使用します。デフォルトの類似性インデックスは50%です。

-C[<n>]
--find-copies[=<n>]

コピーと名前の変更を検出します。--find-copies-harderも参照してください。n を指定すると、-M<n>と同じ意味になります。

--find-copies-harder

パフォーマンス上の理由からデフォルトでは-Cオプションはコピーのオリジナルファイルが同じチェンジセットで変更された場合にのみコピーを検索します。このフラグによりコマンドは変更されていないファイルをコピー元の候補として検出します。これは大規模なプロジェクトでは非常にコストのかかる操作であるため、注意して使用してください。複数の-Cオプションを指定しても同じ効果があります。

-D
--irreversible-delete

削除するプレイメージを省略します。つまりヘッダーのみを出力し、プレイメージと/dev/nullの差分は出力しません。結果のパッチはpatchもしくはgit applyで適用されることを意図したものではありません。これは変更後のテキストの確認に集中したい人のためだけのものです。さらに出力には明らかにそのようなパッチを手動でも逆に適用するのに十分な情報が不足しているため、オプションの名前が付けられています。

-Bと併用する場合、削除/作成ペアの削除部分のプリイメージも省略してください。

-l<num>

-M-CオプションにはO(n ^ 2)処理時間が必要です。ここでnは潜在的な名前変更もしくはコピーターゲットの数です。このオプションは名前変更もしくはコピーターゲットの数が指定された数を超えた場合、名前変更もしくはコピー検出が実行されないようにします。

--diff-filter=[(A|C|D|M|R|T|U|X|B)…[*]]

追加(A)、コピー(C)、削除(D)、変更(M)、名前変更(R)され、タイプ(つまり通常のファイル、シンボリックリンク、サブモジュールなど)が変更された(T)、マージされていない(U)、不明である(X)、またはペアリングが壊れている(B)ファイルのみを選択します。フィルタ文字の任意の組み合わせ(なしを含む)を使用できます。* (すべてもしくはなし)が組み合わせに追加されると、比較で他の基準に一致するファイルがある場合、すべてのパスが選択されます。他の基準に一致するファイルがない場合、何も選択されません。

またこれらの大文字は小文字で除外できます。例えば--diff-filter=adは追加および削除されたパスを除外します。

すべての差分がすべてのタイプとするわけではないことに注意してください。例えば、インデックスからワークツリーへの差分にエントリを追加することはできません(差分に含まれるパスのセットはインデックスの内容によって制限されるため)。同様にこれらのタイプの検出が無効になっている場合、コピーおよび名前変更されたエントリは表示されません。

-S<string>

ファイル内の指定された文字列の出現回数(つまり追加/削除)を変更する差分を探します。スクリプト作成者が使用することを目的としています。

コードの正確なブロック(構造体など)を探し、そのブロックが最初に作成されてからの履歴を知りたい場合に便利です。この機能を繰り返し使用し、プリイメージ内の興味深いブロックにフィードバックします。-S、そしてブロックの最初のバージョンを取得するまで続けます。

バイナリファイルも検索されます。

-G<regex>

パッチテキストに<regex>に一致する追加/削除されたラインが含まれている差分を探します。

-S<regex> --pickaxe-regex-G<regex>の違いを説明するために、同じファイル内で次の差分を使用したコミットについて考えてみます。

+    return frotz(nitfol, two->ptr, 1, 0);
...
-    hit = frotz(nitfol, mf2.ptr, 1, 0);

git log -G"frotz\(nitfol"はこのコミットを表示しますが、git log -S"frotz\(nitfol" --pickaxe-regexは表示しません(その文字列の出現回数が変更されていないため)。
--textが提供されていない限り、textconvフィルターのないバイナリファイルのパッチは無視されます。

詳細については gitdiffcore[7]の「pickaxe」エントリを参照してください。

--find-object=<object-id>

指定されたオブジェクトの出現回数を変更する違いを探します。-Sと同様に引数だけが異なり、特定の文字列ではなく特定のオブジェクトIDを検索します。

オブジェクトはブロブまたはサブモジュールのコミットにすることができます。これはgit-log-tオプションがツリーも検索することを意味します。

--pickaxe-all

–Sまたは-G が変更を検出したら、<string>の変更を含むファイルだけでなく、その変更セット内のすべての変更を表示します。

--pickaxe-regex

-Sに指定された<string>を一致する拡張POSIX正規表現として扱います。

-O<orderfile>

ファイルが出力に表示される順序をコントロールします。これはdiff.orderFile構成変数を上書きします( git-config[1]を参照)。diff.orderFileをキャンセルするには-O/dev/nullを使用します。

出力順序は<orderfile>内のブロブパターンの順序によって決定されます。最初のパターンに一致するパス名を持つすべてのファイルが最初に出力され、2番目のパターンに一致する(ただし最初のパターンには一致しない)パス名を持つすべてのファイルが次に出力されます。パス名がどのパターンとも一致しないすべてのファイルはファイルの最後にすべての一致パターンがあるかのように最後に出力されます。複数のパス名のランクが同じである場合(同じパターンに一致するが、以前のパターンには一致しない)、出力順序は通常の順序です。

<orderfile>は次のように検出されます。

  • 空白ラインは無視されるため、読みやすくするための区切り文字として使用できます。
  • ハッシュ( “#“)で始まるラインは無視されるため、コメントに使用できます。パターンがハッシュで始まる場合、パターンの先頭にバックスラッシュ(”\”)を追加します。
  • 他の各ラインにはシングルパターンが含まれています。

パターンは「FNM_PATHNAME」フラグなしで「fnmatch(3)」に使用されるパターンと同じ構文とセマンティクスを持ちますが、最終的なパス名コンポーネントをいくつでも削除するとパターンと一致する場合、パス名もパターンと一致します。例えば、パターン「foo*bar」は「fooasdfbar」および「foo/bar/baz/asdf」と一致しますが、「foobarx」とは一致しません。

-R

2つの入力を交換します。つまり、インデックスまたはディスク上のファイルとツリーの内容の違いを示します。

--relative[=<path>]
--no-relative

プロジェクトのサブディレクトリから実行する場合、このオプションを使用して、ディレクトリ外の変更を除外し、それに関連するパス名を表示するように指示できます。サブディレクトリ(ベアリポジトリなど)にない場合、引数として<path>を指定することで、出力を作成するサブディレクトリに名前を付けることができます。--no-relativeを使用して、diff.relative構成オプションと以前の--relativeの両方を無効にすることができます。

-a
--text

すべてのファイルをテキストとして扱います。

--ignore-cr-at-eol

比較を行う時、ライン末のキャリッジリターンを無視します。

--ignore-space-at-eol
EOLで空白の変更を無視します。

-b
--ignore-space-change

空白の量の変更は無視してください。これは、ライン末の空白を無視し、1つ以上の空白文字の他のすべてのシーケンスを同等と見なします。

-w
--ignore-all-space

ラインを比較するときは空白を無視します。これは一方のラインに空白があり、もう一方のラインに空白がない場合でも、違いを無視します。

--ignore-blank-lines

ラインがすべて空白の変更は無視してください。

--inter-hunk-context=<lines>

指定されたライン数までの差分ハンク間のコンテキストを表示し、それによって互いに近いハンクを融合します。デフォルトはdiff.interHunkContextで構成オプションが設定されていない場合は0です。

-W
--function-context

変化の周辺機能全体を表示します。

--exit-code

「diff(1)」と同様のコードでプログラムを終了させます。つまり違いがあった場合は1で終了し、0は違いがないことを意味します。

--quiet

プログラムのすべての出力を無効にします。--exit-codeを意味します。

--ext-diff

外部の差分ヘルパーの実行を許可します。gitattributes[5]を使用して外部の差分ドライバーを設定する場合、このオプションをgit-log[1] およびその仲間と一緒に使用する必要があります。

--no-ext-diff

外部の差分ドライバーを禁止します。

--textconv
--no-textconv

バイナリファイルを比較する時、外部テキスト変換フィルターの実行を許可(または禁止)します。詳細についてはgitattributes[5] を参照してください。テキストコンバージョンフィルターは通常、一方向の変換であるため、結果の差分は人が使う分には適していますが、適用することはできません。このためテキストコンバージョンフィルターはデフォルトでgit-diff[1] とgit-log[1]に対してのみ有効になり、git-format-patch[1]または差分配管コマンドに対しては有効になりません。

--ignore-submodules[=<when>]

差分作成のサブモジュールへの変更を無視します。<when>は「none」、「untracked」、「dirty」、または「all」のいずれかになります。これがデフォルトです。「none」を使用すると、追跡されていないファイルまたは変更されたファイルが含まれている場合、またはそのヘッドがスーパープロジェクトに記録されているコミットと異なる場合にサブモジュールが変更されたと見なされ、git-config[1]もしくは gitmodules[5]のオプションの設定を上書きできます。「untracked」が使用されている場合、サブモジュールには追跡されていないコンテンツのみが含まれている場合、サブモジュールはダーティとは見なされません(ただし、変更されたコンテンツはスキャンされます)。 「dirty」を使用すると、サブモジュールのワークツリーへのすべての変更が無視され、スーパープロジェクトに格納されているコミットへの変更のみが表示されます(これは1.7.0までの動作です)。 「all」を使用すると、サブモジュールへのすべての変更が非表示になります。

--src-prefix=<prefix>

「a /」の代わりに指定されたソースプレフィックスを表示します。

--dst-prefix=<prefix>

「b /」の代わりに、指定された宛先プレフィックスを表示します。

--no-prefix

送信元または宛先のプレフィックスを表示しません。

--line-prefix=<prefix>

出力のすべてのラインに追加のプレフィックスを付加します。

--ita-invisible-in-index

デフォルトでは「git add -N」によって追加されたエントリは「gitdiff」に既存の空ファイルとして表示され、「gitdiff–cached」に新しいファイルとして表示されます。このオプションを使用するとエントリは「git diff」では新しいファイルとして表示され、「gitdiff–cached」では存在しません。 このオプションは--ita-visible-in-indexで元に戻すことができます。どちらのオプションも実験的なものであり、将来削除される可能性があります。

これらの一般的なオプションの詳細についてはgitdiffcore[7]も参照してください。

-1 --base
-2 --ours
-3 --theirs

ワークツリーを「ベース」バージョン(ステージ#1)、「私たちのブランチ」(ステージ#2)、または「それらのブランチ」(ステージ#3)と比較します。インデックスにはマージされていないエントリの場合、つまりコンフリクトを解決している場合にのみこれらのステージが含まれます。詳細についてはgit-read-tree[1] セクションの「3方向マージ」を参照してください。

-0

マージされていないエントリの差分出力を省略し、「Unmerged」と表示します。ワークツリーをインデックスと比較する場合にのみ使用できます。

<path>…

<paths>パラメータを指定すると、差分を名前付きパスに制限するために使用されます(ディレクトリ名を指定して、その下にあるすべてのファイルの差分を取得できます)。

ロー出力フォーマット

「git-diff-index」、「git-diff-tree」、「git-diff-files」、「gitdiff–raw」からのロー出力フォーマットは非常に似ています。

これらのコマンドはすべて2つのセットを比較します。比較されるものは異なります。

git-diff-index <tree-ish>

<tree-ish>とファイルシステム上のファイルを比較します。

git-diff-index --cached <tree-ish>

<tree-ish>とインデックスを比較します。

git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>…]

2つの引数で指定されたツリーを比較します。

git-diff-files [<pattern>…]

インデックスとファイルシステム上のファイルを比較します。

「git-diff-tree」コマンドは比較対象のハッシュを出力することで出力を開始します。その後、すべてのコマンドは変更されたファイルごとに1つの出力ラインで出力します。

出力ラインは次のようにフォーマット化されます。

in-place edit  :100644 100644 bcd1234 0123456 M file0
copy-edit      :100644 100644 abcd123 1234567 C68 file1 file2
rename-edit    :100644 100644 abcd123 1234567 R86 file1 file3
create         :000000 100644 0000000 1234567 A file4
delete         :100644 000000 1234567 0000000 D file5
unmerged       :000000 000000 0000000 0000000 U file6

つまり、左から右へ

  1. コロン
  2. 「src」のモード。 作成またはマージされていない場合は000000となります。
  3. スペース
  4. 「dst」のモード。 削除またはマージされていない場合は000000となります。
  5. スペース
  6. 「src」のsha1。作成またはマージされていない場合は0 {40}となります。
  7. スペース
  8. 「dst」のsha1。作成、マージ解除、または「ワークツリーを見る」場合は0 {40}となります。
  9. スペース
  10. ステータスの後にオプションの「スコア」番号が続きます。
  11. -z オプションが使用されている場合、タブまたはNULとなります。
  12. 「src」のパス
  13. -z オプションが使用されている場合、タブまたはNULとなります。CまたはRにのみ存在します。
  14. 「dst」のパス。 CまたはRにのみ存在します。
  15. -z オプションを使用した場合、LFまたはNULは記録を終了します。

考えられる文字としては次の通りです。

  • A:ファイルの追加
  • C:ファイルを新しいファイルにコピーする
  • D:ファイルの削除
  • M:ファイル内容またはモードの変更
  • R:ファイルの名前変更
  • T:ファイルの種類の変更
  • U:ファイルはマージされていません(コミットする前にマージを完了する必要があります)
  • X:「不明な」変更タイプ(おそらくバグです。報告してください)

ステータス文字CとRの後には常にスコアが続きます(移動またはコピーのソースとターゲットの間の類似性のパーセンテージで示します)。ステータス文字Mの後にはファイルの書き換えのスコア(非類似度のパーセンテージを示す)が続く場合があります。
<sha1>はファイルがファイルシステム上で新しく、インデックスと同期していない場合、すべて0として表示されます。

例:

:100644 100644 5be4a4a 0000000 M file.c

-zオプションを指定しない場合、構成変数core.quotePathで説明されているように「異常な」文字を含むパス名が引用符で囲まれます(git-config[1]を参照)。-z を使用すると、ファイル名が逐語的に出力され、ラインはNULバイトで終了します。

マージの差分フォーマット

「git-diff-tree」、「git-diff-files」、「git-diff –raw」は-c または–cc オプションを使用し、マージコミットに対しても差分出力を作成できます。出力は次の点で上記のフォーマットとは異なります。

  1. 各ペアレントにコロンがあります
  2. より多くの「src」モードと「src」sha1があります
  3. ステータスは各ペアレントのステータス文字を連結したものです
  4. オプションの「スコア」番号はありません
  5. ファイルのタブ区切りのパス名

-c および --ccの場合、履歴のいずれかの側でファイルの名前が変更された場合でも、宛先または最終パスのみが表示されます。--combined-all-pathsを使用すると、各ペアレントのパスの名前が表示され、その後にマージコミットのパスの名前が表示されます。

--combined-all-pathsを使用しない-cおよび--ccの例

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM	desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM	bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR	phooey.c

--combined-all-paths-c もしくは--ccのいずれかに追加された場合の例。

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM	desc.c	desc.c	desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM	foo.sh	bar.sh	bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR	fooey.c	fuey.c	phooey.c

結合された差分はすべてのペアレントから変更されたファイルのみをリスト化することに注意してください。

-pを使用してパッチテキストを作成

git-diff[1]、git-log[1]、git-show[1]、git-diff-index[1]、git-diff-tree[1]、もしくは git-diff-files[1]で実行する-pオプションはパッチテキストを作成します。

GIT_EXTERNAL_DIFFGIT_DIFF_OPTSの環境変数を介してパッチテキストの作成をカスタマイズできます(git[1]を参照)。

-pオプションが作成するものは、従来の差分形式とは少し異なります。

  1. 次のような「gitdiff」ヘッダーがあります。
    diff --git a/file1 b/file2
    

    名前の変更/コピーが含まれない限り、a/ b/のファイル名は同じです。特に作成または削除の場合でも、a/もしくは b/ ファイル名の代わりに/dev/nullは使用されません。
    名前変更/コピーが含まれる場合、file1 とfile2 はそれぞれ名前変更/コピーのソースファイルの名前と名前変更/コピーが作成するファイルの名前を示します。

  2. 1つ以上の拡張ヘッダーラインが続きます。
    old mode <mode>
    new mode <mode>
    deleted file mode <mode>
    new file mode <mode>
    copy from <path>
    copy to <path>
    rename from <path>
    rename to <path>
    similarity index <number>
    dissimilarity index <number>
    index <hash>..<hash> <mode>
    

    ファイルモードはファイルタイプとファイル許可ビットを含む6桁の8進数として出力されます。
    拡張ヘッダーのパス名にはa/b/ のプレフィックスは含まれません。
    類似性指数は変更されていないラインのパーセンテージであり、非類似性指数は変更されたラインのパーセンテージです。これは切り捨てられた整数であり、その後にパーセント記号が続きます。 したがって100%の類似性インデックス値は2つの等しいファイル用にリザーブされていますが、100%の非類似性は古いファイルから新しいファイルへのラインがないことを意味します。
    インデックスラインには変更前後のブロブオブジェクト名が含まれます。<mode>はファイルモードが変更されない場合に含まれます。それ以外の場合、別々のラインは古いモードと新しいモードを示します。

  3. 構成変数core.quotePathで説明されているように「異常な」文字を含むパス名が引用符で囲まれます(git-config[1]を参照)。
  4. 出力内のすべてのfile1ファイルはコミット前のファイルを参照し、すべてのfile2ファイルはコミット後のファイルを参照します。各変更を各ファイルに順番に適用するのは誤りです。 例えば、このパッチはaとbを交換します。
    diff --git a/a b/b
    rename from a
    rename to b
    diff --git a/b b/a
    rename from b
    rename to a
    

結合された差分フォーマット

差分を作成するコマンドはマージを表示するときに-cまたは --cc オプションを使用して、結合された差分を作成できます。これは、git-diff[1]もしくはgit-show[1]とのマージを表示するときのデフォルトのフォーマットです。これらのコマンドのいずれかに-mオプションを指定して、マージの個々のペアレントとの差分の作成ができることにも注意してください。

「結合された差分」フォーマットは次のようになります。

diff --combined describe.c
index fabadb8,cc95eb0..4866510
--- a/describe.c
+++ b/describe.c
@@@ -98,20 -98,12 +98,20 @@@
	return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
	}

- - static void describe(char *arg)
	-static void describe(struct commit *cmit, int last_one)
	++static void describe(char *arg, int last_one)
	{{
+	unsigned char sha1[20];
+	struct commit *cmit;
		struct commit_list *list;
		static int initialized = 0;
		struct commit_name *n;

+	if (get_sha1(arg, sha1) < 0)
+		usage(describe_usage);
+	cmit = lookup_commit_reference(sha1);
+	if (!cmit)
+		usage(describe_usage);
+
	if (!initialized) {
		initialized = 1;
		for_each_ref(get_name);
  1. 「gitdiff」ヘッダーが前にあり、このようになります(-cオプションを使用した場合)。
    diff --combined file

    もしくはこのようになります(–ccオプションが使用されている場合)。

    diff --cc file
  2. その後に1つ以上の拡張ヘッダー行が続きます(この例では2つのペアレントのマージを示しています)。
    index <hash>,<hash>..<hash>
    mode <mode>,<mode>..<mode>
    new file mode <mode>
    deleted file mode <mode>,<mode>
    

    mode <mode>,<mode>..<mode>ラインは<mode>の少なくとも1つが他の<mode>と異なる場合にのみ表示されます。検出されたコンテンツの移動(名前の変更とコピーの検出)に関する情報を含む拡張ヘッダーは2つの<tree-ish>の差分で機能するように設計されており、組み合わせた差分フォーマットでは使用されません。

  3. その後に2つのラインの「from-file / to-file」ヘッダーが続きます
    --- a/file
    +++ b/file
    

    従来の統合差分フォーマットの2ラインヘッダーと同様に/dev/null は作成または削除されたファイルを通知するために使用されます。
    ただし、「-combined-all-paths」オプションが指定されている場合、2ライン目の「from-file / to-file」の代わりに、N +1ライン目の「from-file / to-file」ヘッダーが取得されます。ここでNとはマージコミットにおけるペアレントの数です。

    --- a/file
    --- a/file
    --- a/file
    +++ b/file
    

    この拡張フォーマットは名前変更またはコピー検出がアクティブな場合に役立ち、さまざまなペアレントファイルのオリジナルの名前を確認できます。

  4. チャンクヘッダーのフォーマットが変更され、patch -p1に誤ってフィードされるのを防ぎます。結合された差分フォーマットはマージコミットの変更を確認するために作成されたものであり、適用されることを意図したものではありません。この変更は拡張インデックスヘッダーの変更と似ています。
    @@@ <from-file-range> <from-file-range> <to-file-range> @@@
    

    結合された差分フォーマットのチャンクヘッダーには(ペアレントの数+ 1)@文字があります。
    従来の統合差分フォーマットとは異なり、2つのファイルAとBが-(マイナスはAに表示されますが、Bでは削除されます)、+(プラスはAではないですが、Bに追加されます)、または” ” プレフィックス( スペースは変更なし)です。このフォーマットは2つ以上のファイル「file1」、「file2」、…を1つのファイルXと比較し、Xが各「fileN」とどのように異なっているかを示します。ファイルNごとに1つのラインが出力ラインの前に追加され、Xのラインが出力ラインとどのように異なるかを示します。
    Nラインの- 文字はそのラインが「fileN」に表示されますが、結果には表示されないことを意味します。列Nの+文字はそのラインが結果に表示され、「fileN」にそのラインがないことを意味します(つまり、そのペアレントの観点からはそのラインが追加されたということです)。
    上記の出力例では、シグネチャ機能が両方のファイルから変更されています(したがって2つ-が「file1」と「file2」の両方から削除されることに加えて、++ は追加された1ラインが「file1」または「file2」のどちらにも表示されないことを意味します)。また他の8ラインは「file1」と同じですが、「file2」には表示されません(したがって、接頭辞+が付きます)。
    git diff-tree -cで示される場合、マージコミットのペアレントをマージ結果と比較します(つまり、「file1..fileN」がペアレントとなります)。git diff-files -cで示されている場合、2つの未解決のマージペアレントをワークツリーファイルと比較します(つまり、「file1」はステージ2であり、別名「私たちのバージョン」です。「file2」はステージ3であり、別名「それらのバージョン」となります)。

他の差分フォーマット

--summaryオプションは新しく追加、削除、名前変更、およびコピーされたファイルを記述しています。--statオプションは「diffstat(1)」グラフを出力に追加します。これらのオプションは-pなどの他のオプションと組み合わせることができ、人が使えるようにすることを目的としています。

名前の変更またはコピーを伴う変更を表示する場合、--stat出力はパス名の共通のプレフィックスとサフィックスを組み合わせることにより、パス名をコンパクトにフォーマットします。例えば、4ラインを変更しながらarch/i386/Makefilearch/x86/Makefile に移動する変更は次のように表示されます。

arch/{i386 => x86}/Makefile    |   4 +--

--numstatオプションは「diffstat(1)」に情報を提供しますが、マシンの処理を容易にするように設計されています。--numstat出力のエントリは次のようになります。

1	2	README
3	1	arch/{i386 => x86}/Makefile

左から右へ、次のようになります。

  1. 追加されたラインの数
  2. タブ
  3. 削除されたラインの数
  4. タブ
  5. パス名(名前変更/コピー情報を含む)
  6. 改ライン

-z 出力オプションが有効な場合、出力は次のようにフォーマットされます。

1	2	README NUL
3	1	NUL arch/i386/Makefile NUL arch/x86/Makefile NUL

つまり、次のようになります。

  1. 追加されたラインの数
  2. タブ
  3. 削除されたラインの数
  4. タブ
  5. NUL(名前を変更/コピーした場合にのみ存在)
  6. プリイメージにおけるパス名
  7. NUL(名前が変更/コピーされた場合にのみ存在)
  8. ポストイメージにおけるパス名(名前を変更/コピーした場合にのみ存在)
  9. NUL

名前が変更された場合のプリイメージパス前の追加のNULは出力を読み取るスクリプトが読み取られている現在のレコードがシングルパスレコードであるか、先読みせずに名前変更/コピーレコードであるかを判断できるようにするためです。追加および削除されたラインを読み取った後、NULまで読み取るとパス名が作成されますが、それがNULの場合、レコードには2つのパスが表示されます。

ワークツリーを確認する様々な方法

$ git diff            (1)
$ git diff --cached   (2)
$ git diff HEAD       (3)
  1. 次のコミットのためにまだステージングされていないワークツリーの変更
  2. インデックスと最後のコミットの間の変更。「-a」オプションなしで「gitcommit」を実行した場合のコミットする内容
  3. 最後のコミット以降のワークツリーの変更。「gitcommit-a」を実行した場合にコミットする内容

任意のコミットとの比較

$ git diff test            (1)
$ git diff HEAD -- ./test  (2)
$ git diff HEAD^ HEAD      (3)
  1. 現在のブランチの末端を使用する代わりに、「test」ブランチの末端と比較します。
  2. 「test」ブランチの先端と比較する代わりに、現在のブランチの末端と比較しますが、比較はファイル「test」に限定します。
  3. 最後のコミット前と最後のコミット時のバージョンを比較します。

ブランチの比較

$ git diff topic master    (1)
$ git diff topic..master   (2)
$ git diff topic...master  (3)
  1. トピックのヒントとマスターブランチ間の変更
  2. 上記と同じ
  3. トピックブランチが開始されてからマスターブランチで発生した変更

差分出力の制限

$ git diff --diff-filter=MRC            (1)
$ git diff --name-status                (2)
$ git diff arch/i386 include/asm-i386   (3)
  1. 変更、名前変更、コピーのみを表示し、追加や削除は表示しません。
  2. 名前と変更の性質のみを表示し、実際の差分出力は表示しません。
  3. 差分出力を名前付きサブツリーに制限します。

差分出力の変更

$ git diff --find-copies-harder -B -C  (1)
$ git diff -R                          (2)
  1. 名前の変更、コピー、完全な書き換えを見つけるために追加のサイクルを使います(非常に高価になります)。
  2. 差分を逆に出力します。

参照

diff(1), git-difftool[1], git-log[1], gitdiffcore[7], git-format-patch[1], git-apply[1], git-show[1]

GIT

git[1]パッケージソフトの一部

git公式ドキュメント

diff