日本語 ▾ トピック ▾ 最新バージョン ▾ git-diff-files は 2.48.0 で最終更新されました

名称

git-diff-files - ワーキングツリーとインデックス内のファイルを比較する

概要

git diff-files [-q] [-0 | -1 | -2 | -3 | -c | --cc] [<common-diff-options>] [<path>…​]

説明

ワーキングツリーとインデックス内のファイルを比較します。パスが指定された場合、指定されたパスのみを比較します。指定されない場合、インデックス内のすべてのエントリが比較されます。出力形式は git diff-index および git diff-tree と同じです。

オプション

-p
-u
--patch

パッチを生成します(-p でパッチテキストを生成する を参照)。

-s
--no-patch

差分生成機構からの出力をすべて抑制します。デフォルトでパッチを表示する git show のようなコマンドの出力を抑制したり、エイリアス内でコマンドラインの早い段階で指定された --patch--stat のようなオプションの効果を打ち消すのに役立ちます。

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

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

--output=<file>

標準出力ではなく、特定のファイルに出力します。

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

生成されるパッチで、新規、古い、またはコンテキスト行を示すために使用する文字を指定します。通常、それぞれ +-、' ' です。

--raw

差分をraw形式で生成します。これがデフォルトです。

--patch-with-raw

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

--indent-heuristic

差分ハンクの境界を移動させてパッチを読みやすくするヒューリスティックを有効にします。これがデフォルトです。

--no-indent-heuristic

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

--minimal

最小限の差分が生成されるように、余分な時間を費やします。

--patience

"patience diff" アルゴリズムを使用して差分を生成します。

--histogram

"histogram diff" アルゴリズムを使用して差分を生成します。

--anchored=<text>

"anchored diff" アルゴリズムを使用して差分を生成します。

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

ソースとデスティネーションの両方に存在し、一度だけ存在し、<text> で始まる行がある場合、このアルゴリズムはそれが出力で削除または追加として表示されるのを防ごうとします。内部的には "patience diff" アルゴリズムを使用します。

--diff-algorithm=(patience|minimal|histogram|myers)

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

default
myers

基本的な貪欲差分アルゴリズム。現在、これがデフォルトです。

minimal

最小限の差分が生成されるように、余分な時間を費やします。

patience

パッチを生成する際に "patience diff" アルゴリズムを使用します。

histogram

このアルゴリズムは、patience アルゴリズムを拡張して「出現頻度の低い共通要素をサポート」します。

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

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

差分統計を生成します。デフォルトでは、ファイル名部分に必要に応じてスペースが使用され、残りはグラフ部分に使用されます。最大幅はターミナル幅がデフォルトですが、ターミナルに接続されていない場合は80列となり、<width> で上書きできます。ファイル名部分の幅は、コンマの後に別の幅 <name-width> を与えるか、diff.statNameWidth=<name-width> を設定することで制限できます。グラフ部分の幅は、--stat-graph-width=<graph-width> を使用するか、diff.statGraphWidth=<graph-width> を設定することで制限できます。--stat または --stat-graph-width を使用すると、統計グラフを生成するすべてのコマンドに影響しますが、diff.statNameWidth または diff.statGraphWidth を設定しても git format-patch には影響しません。3番目のパラメータ <count> を指定することで、最初の <count> 行に出力を制限し、それ以上ある場合は ... が続きます。

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

--compact-summary

差分統計で、ファイル作成や削除("new" または "gone"、シンボリックリンクの場合はオプションで +l)、およびモード変更(実行可能ビットの追加または削除に対してそれぞれ +x または -x)などの拡張ヘッダー情報の凝縮された要約を出力します。この情報はファイル名部分とグラフ部分の間に配置されます。--stat を意味します。

--numstat

--stat と似ていますが、追加および削除された行数を10進表記で表示し、パス名を省略せずに表示することで、機械処理に適した形式にします。バイナリファイルの場合、0 0 と表示する代わりに2つの - を出力します。

--shortstat

--stat 形式の最後の行のみを出力します。この行には、変更されたファイルの総数、および追加および削除された行数が含まれます。

-X [<param>,...]
--dirstat[=<param>,...]

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

changes

ソースから削除された行、またはデスティネーションに追加された行を数えることによって dirstat の数値を計算します。これは、ファイル内の純粋なコード移動の量を無視します。言い換えれば、ファイル内の行の並べ替えは、他の変更ほどカウントされません。これは、パラメータが与えられない場合のデフォルトの動作です。

lines

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

files

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

cumulative

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

<limit>

整数パラメータは、カットオフ率(デフォルトは3%)を指定します。この割合以下の変更量しか寄与しないディレクトリは出力に表示されません。

例:以下は、変更されたファイルの総量の10%未満しか変更していないディレクトリを無視し、子ディレクトリのカウントを親ディレクトリに累積しながら、変更されたファイルをカウントします: --dirstat=files,10,cumulative

--cumulative

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

--dirstat-by-file[=<param>,...]

--dirstat=files,<param>,... の同義語です。

--summary

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

--patch-with-stat

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

-z

--raw--numstat--name-only、または --name-status が指定されている場合、パス名をそのまま出力し、NULをフィールド区切り文字として使用します。

このオプションがない場合、「異常な」文字を含むパス名は、設定変数 core.quotePath で説明されているように引用符で囲まれます(git-config[1] を参照)。

--name-only

変更された各ファイルのファイル名をポストイメージツリーにのみ表示します。ファイル名はしばしばUTF-8でエンコードされています。詳細については、git-log[1] マニュアルページのエンコーディングに関する説明を参照してください。

--name-status

変更された各ファイルの名称とステータスのみを表示します。ステータス文字の意味については、--diff-filter オプションの説明を参照してください。--name-only と同様に、ファイル名はしばしばUTF-8でエンコードされています。

--submodule[=<format>]

サブモジュールの差分表示方法を指定します。--submodule=short を指定すると、short 形式が使用されます。この形式は、範囲の最初と最後のコミット名のみを表示します。--submodule または --submodule=log が指定された場合、log 形式が使用されます。この形式は、git-submodule[1] summary と同様に、範囲内のコミットをリストします。--submodule=diff が指定された場合、diff 形式が使用されます。この形式は、コミット範囲間のサブモジュール内容の変更をインライン差分で表示します。設定オプションが設定されていない場合、diff.submodule または short 形式がデフォルトとなります。

--color[=<when>]

色付きの差分を表示します。--color(つまり =<when> なし)は --color=always と同じです。<when> には alwaysnever、または auto のいずれかを指定できます。

--no-color

色付き差分をオフにします。これは --color=never と同じです。

--color-moved[=<mode>]

移動したコード行は異なる色で表示されます。オプションが指定されていない場合、<mode> はデフォルトで no となり、モードなしでオプションが指定された場合は zebra となります。モードは以下のいずれかである必要があります。

no

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

default

zebra の同義語です。将来的に、より適切なモードに変更される可能性があります。

plain

ある場所に追加され、別の場所で削除された行は、color.diff.newMoved で着色されます。同様に、差分の別の場所で追加された削除行には color.diff.oldMoved が使用されます。このモードは、あらゆる移動行を検出しますが、コードブロックが並べ替えなしで移動したかどうかをレビューで判断するにはあまり役に立ちません。

blocks

少なくとも20個の英数字からなる移動したテキストブロックは、貪欲に検出されます。検出されたブロックは color.diff.(old|new)Moved のいずれかの色を使用して描画されます。隣接するブロックは区別できません。

zebra

blocks モードと同様に、移動したテキストブロックが検出されます。ブロックは 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=<mode>,...

これは、--color-moved の移動検出を実行する際に空白文字を無視する方法を設定します。これらのモードはカンマ区切りリストとして指定できます。

no

移動検出を実行する際に空白文字を無視しません。

ignore-space-at-eol

行末の空白文字の変更を無視します。

ignore-space-change

空白文字の量の変更を無視します。これにより、行末の空白文字が無視され、1つ以上の空白文字の他のすべてのシーケンスは等価と見なされます。

ignore-all-space

行を比較する際に空白文字を無視します。これにより、一方の行に空白があり、もう一方の行に空白がない場合でも違いを無視します。

allow-indentation-change

移動検出時にすべての空白文字を最初に無視し、その後、行ごとの空白文字の変更が同じ場合にのみ、移動したコードブロックを1つのブロックにグループ化します。これは他のモードとは互換性がありません。

--no-color-moved-ws

移動検出を実行する際に空白文字を無視しません。これは設定を上書きするために使用できます。--color-moved-ws=no と同じです。

--word-diff[=<mode>]

デフォルトでは、単語は空白文字で区切られます。以下の --word-diff-regex を参照してください。<mode> はデフォルトで plain となり、以下のいずれかである必要があります。

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>

差分の contextold、または new 行にある空白文字エラーをハイライトします。複数の値はカンマで区切られ、none は以前の値をリセットし、default はリストを new にリセットし、allold,new,context の略語です。このオプションが指定されておらず、設定変数 diff.wsErrorHighlight が設定されていない場合、new 行の空白文字エラーのみがハイライトされます。空白文字エラーは color.diff.whitespace で着色されます。

--full-index

パッチ形式の出力を生成する際、「index」行に最初の数文字ではなく、プリイメージとポストイメージの完全なブロブオブジェクト名を表示します。

--binary

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

--abbrev[=<n>]

diff-raw形式の出力およびdiff-treeヘッダー行で完全な40バイトの16進オブジェクト名を表示する代わりに、オブジェクトを一意に参照する最短の、少なくとも <n> 桁の16進数からなるプレフィックスを表示します。diff-patch出力形式では、--full-index が優先されます。つまり、--full-index が指定されている場合、--abbrev にかかわらず完全なブロブ名が表示されます。デフォルト以外の桁数は --abbrev=<n> で指定できます。

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

完全な書き換え変更を削除と作成のペアに分割します。これは2つの目的を果たします。

これは、ファイルの完全な書き換えに相当する変更が、テキスト的に一致する非常に少数の行がコンテキストとして混ざった一連の削除と挿入としてではなく、古いもののすべてを単一で削除し、新しいもののすべてを単一で挿入する方法に影響します。数値 <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 の間の差分は出力しません。結果のパッチは patchgit apply で適用することを意図したものではありません。これは変更後のテキストのレビューにのみ集中したい人向けです。さらに、このオプションの名前の由来であるように、出力にはこのようなパッチを逆方向に、手動でさえ適用するのに十分な情報が明らかに不足しています。

-B と一緒に使用すると、削除/作成ペアの削除部分にあるプレイメージも省略します。

-l<num>

-M-C オプションには、名前変更/コピーのサブセットを安価に検出できる予備ステップが含まれ、その後、残りのすべてのペアになっていないデスティネーションをすべての関連するソースと比較する徹底的なフォールバック部分が続きます。(名前変更の場合、残りのペアになっていないソースのみが関連します。コピーの場合、すべての元のソースが関連します。)N個のソースとデスティネーションの場合、この徹底的なチェックはO(N^2)です。このオプションは、関係するソース/デスティネーションファイルの数が指定された数を超えた場合、名前変更/コピー検出の徹底的な部分が実行されるのを防ぎます。デフォルトは diff.renameLimit です。0の値は無制限として扱われることに注意してください。

--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>

ファイル内で指定された <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> 内のglobパターンの順序によって決定されます。最初のパターンに一致するパス名を持つすべてのファイルが最初に出力され、2番目のパターンに一致するパス名を持つすべてのファイル(ただし最初のパターンには一致しない)が次に出力され、以降同様です。どのパターンにも一致しないパス名を持つすべてのファイルは、ファイルの最後に暗黙的なマッチオールパターンがあるかのように、最後に出力されます。複数のパス名が同じランク(同じパターンに一致するが、それ以前のパターンには一致しない)を持つ場合、それらの相対的な出力順序は通常の順序になります。

<orderfile> は次のようにパースされます。

  • 空行は無視されるため、可読性のための区切り文字として使用できます。

  • ハッシュ("#")で始まる行は無視されるため、コメントとして使用できます。パターンがハッシュで始まる場合は、冒頭にバックスラッシュ("\")を追加してください。

  • その他の各行には単一のパターンが含まれます。

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

--skip-to=<file>
--rotate-to=<file>

指定された <file> より前のファイルを(出力から)破棄するか(つまり、skip to)、または出力の最後に移動させます(つまり、rotate to)。これらのオプションは主に git difftool コマンドの使用のために考案されたものであり、それ以外ではあまり有用ではないかもしれません。

-R

2つの入力を入れ替えます。つまり、インデックスまたはディスク上のファイルとツリーの内容との差分を表示します。

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

プロジェクトのサブディレクトリから実行した場合、このオプションを使用すると、そのディレクトリ外の変更を除外させ、パス名を相対的に表示させることができます。サブディレクトリにいない場合(例:bareリポジトリの場合)、<path> を引数として与えることで、出力を相対的にするサブディレクトリを指定できます。--no-relative は、diff.relative 設定オプションと以前の --relative の両方を無効にするために使用できます。

-a
--text

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

--ignore-cr-at-eol

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

--ignore-space-at-eol

行末の空白文字の変更を無視します。

-b
--ignore-space-change

空白文字の量の変更を無視します。これにより、行末の空白文字が無視され、1つ以上の空白文字の他のすべてのシーケンスは等価と見なされます。

-w
--ignore-all-space

行を比較する際に空白文字を無視します。これにより、一方の行に空白があり、もう一方の行に空白がない場合でも違いを無視します。

--ignore-blank-lines

行がすべて空白の変更を無視します。

-I<regex>
--ignore-matching-lines=<regex>

すべての行が <regex> に一致する変更を無視します。このオプションは複数回指定できます。

--inter-hunk-context=<number>

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

-W
--function-context

各変更に対して関数全体をコンテキスト行として表示します。関数名は、git diff がパッチハンクヘッダーを決定するのと同じ方法で決定されます(gitattributes[5] の「カスタムハンクヘッダーの定義」を参照)。

--exit-code

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

--quiet

プログラムのすべての出力を無効にします。--exit-code を暗黙的に指定します。終了コードが信頼されていない外部の差分ヘルパーの実行を無効にします。つまり、それぞれの設定オプション diff.trustExitCode または diff.<driver>.trustExitCode、または環境変数 GIT_EXTERNAL_DIFF_TRUST_EXIT_CODE が false の場合です。

--ext-diff

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

--no-ext-diff

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

--textconv
--no-textconv

バイナリファイルの比較時に外部のテキスト変換フィルターの実行を許可(または禁止)します。詳細はgitattributes[5] を参照してください。textconvフィルターは通常、一方向の変換であるため、生成される差分は人間が読める形式には適していますが、適用することはできません。このため、textconvフィルターはデフォルトではgit-diff[1] および git-log[1] のみに有効で、git-format-patch[1] や差分のプラミングコマンドには有効ではありません。

--ignore-submodules[=(none|untracked|dirty|all)]

差分生成時にサブモジュールの変更を無視します。all がデフォルトです。none を使用すると、サブモジュールに追跡されていないファイルまたは変更されたファイルが含まれている場合、またはその HEAD がスーパープロジェクトに記録されたコミットと異なる場合に、サブモジュールが変更されたとみなされ、git-config[1] または gitmodules[5]ignore オプションのあらゆる設定を上書きするために使用できます。untracked を使用した場合、サブモジュールは追跡されていないコンテンツのみを含んでいる場合はダーティとは見なされません(ただし、変更されたコンテンツについては引き続きスキャンされます)。dirty を使用すると、サブモジュールの作業ツリーへのすべての変更が無視され、スーパープロジェクトに保存されているコミットへの変更のみが表示されます(これは1.7.0までの動作でした)。all を使用すると、サブモジュールへのすべての変更が非表示になります。

--src-prefix=<prefix>

"a/" の代わりに指定されたソース <prefix> を表示します。

--dst-prefix=<prefix>

"b/" の代わりに指定された宛先 <prefix> を表示します。

--no-prefix

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

--default-prefix

デフォルトのソースおよび宛先プレフィックス("a/" および "b/")を使用します。これは、diff.noprefixdiff.srcPrefixdiff.dstPrefix、および diff.mnemonicPrefix などの設定変数(git-config[1] を参照)を上書きします。

--line-prefix=<prefix>

出力の各行に追加の <prefix> を前置します。

--ita-invisible-in-index

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

これらの共通オプションに関するより詳細な説明については、gitdiffcore[7] も参照してください。

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

それぞれ「ベース」バージョン、「our branch」、「their branch」に対して差分を取ります。これらのオプションを使用すると、マージされたエントリの差分は表示されません。

デフォルトでは、our branch (-2) ときれいに解決されたパスに対して差分を取ります。オプション -0 を指定すると、マージされていないエントリの差分出力を省略し、「Unmerged」とだけ表示させることができます。

-c
--cc

これはステージ2(our branch)、ステージ3(their branch)、および作業ツリーファイルを比較し、diff-tree がこれらのフラグでマージコミットを表示する方法と同様に、結合された差分を出力します。

-q

存在しないファイルに対しても沈黙を保ちます。

生の出力フォーマット

git-diff-indexgit-diff-treegit-diff-files および git diff --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: 「不明な」変更タイプ(おそらくバグなので報告してください)

ステータス文字 CR の後には、常にスコア(移動またはコピーのソースとターゲット間の類似性の割合を示す)が続きます。ステータス文字 M の後には、ファイルの上書きに対するスコア(非類似性の割合を示す)が続く場合があります。

ファイルシステム上のファイルがインデックスと同期していない場合、「dst」のsha1はすべて0として表示されます。

:100644 100644 5be4a4a 0000000 M file.c

-z オプションがない場合、「特殊な」文字を含むパス名は、設定変数 core.quotePathgit-config[1] を参照)で説明されているように引用符で囲まれて出力されます。-z を使用すると、ファイル名はそのまま出力され、行はNULバイトで終端されます。

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

git-diff-treegit-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_DIFF および GIT_DIFF_OPTS 環境変数(git[1] を参照)、および diff 属性(gitattributes[5] を参照)を介してカスタマイズできます。

-p オプションが生成するものは、従来の差分フォーマットとは少し異なります。

  1. これは、次のような「git diff」ヘッダーが前置されます。

    diff --git a/file1 b/file2

    a/b/ のファイル名は、名前変更/コピーが関与しない限り同じです。特に、作成または削除の場合でも、/dev/nulla/ または b/ のファイル名の代わりに使用されることはありません

    名前変更/コピーが関与する場合、file1file2 はそれぞれ、名前変更/コピー元のファイル名と、名前変更/コピーによって生成されるファイル名を示します。

  2. その後には1つ以上の拡張ヘッダー行が続きます。

    old mode <mode> new mode <mode> 削除されたファイルモード <mode> 新規ファイルモード <mode> コピー元 <path> コピー先 <path> 名前変更元 <path> 名前変更先 <path> 類似度インデックス <number> 非類似度インデックス <number> index <hash>..<hash> <mode>

    ファイルモード <mode> は、ファイルタイプとファイルパーミッションビットを含む6桁の8進数で表示されます。

    拡張ヘッダー内のパス名には a/ および b/ のプレフィックスは含まれません。

    類似度インデックスは変更されていない行の割合であり、非類似度インデックスは変更された行の割合です。これは切り捨てられた整数で、その後にパーセント記号が続きます。したがって、類似度インデックス値100%は、2つの同一のファイルのために予約されており、一方、100%の非類似度は、古いファイルから新しいファイルに移行した行が一つもないことを意味します。

    インデックス行には、変更前と変更後のブロブオブジェクト名が含まれます。ファイルモードが変更されない場合は <mode> が含まれます。そうでない場合は、別々の行で古いモードと新しいモードが示されます。

  3. 「特殊な」文字を含むパス名は、設定変数 core.quotePathgit-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
  5. ハンクヘッダーは、そのハンクが適用される関数の名前を示します。これを特定の言語に合わせて調整する方法の詳細については、gitattributes[5] の「カスタムハンクヘッダーの定義」を参照してください。

結合差分フォーマット

任意の差分生成コマンドは、マージを表示する際に 結合差分 を生成するために -c または --cc オプションを取ることができます。これは、git-diff[1] または git-show[1] でマージを表示する際のデフォルトのフォーマットです。また、特定のフォーマットで差分の生成を強制するために、これらのコマンドのいずれかに適切な --diff-merges オプションを指定できることにも注意してください。

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

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. これには、「git diff」ヘッダーが前置され、それは次のように見えます(-c オプションが使用された場合)。

    diff --combined file

    またはこのようになります(--cc オプションが使用された場合)。

    diff --cc file
  2. その後には1つ以上の拡張ヘッダー行が続きます(この例は2つの親を持つマージを示しています)。

    index <hash>,<hash>..<hash> mode <mode>,<mode>..<mode> 新規ファイルモード <mode> 削除されたファイルモード <mode>,<mode>

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

  3. その後には、2行のfrom-file/to-fileヘッダーが続きます。

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

    従来の unified 差分フォーマットの2行ヘッダーと同様に、/dev/null は作成または削除されたファイルを示すために使用されます。

    ただし、--combined-all-paths オプションが指定された場合、2行のfrom-file/to-fileヘッダーの代わりに、マージコミットの親の数であるN+1行のfrom-file/to-fileヘッダーが表示されます。

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

    この拡張フォーマットは、名前変更またはコピー検出がアクティブな場合に、異なる親におけるファイルの元の名前を確認できるため、有用です。

  4. チャンクヘッダーのフォーマットは、誤って patch -p1 に渡されるのを防ぐために変更されています。結合差分フォーマットはマージコミットの変更をレビューするために作成されたものであり、適用されることを意図していませんでした。この変更は、拡張 index ヘッダーの変更に似ています。

    @@@ <from-file-range> <from-file-range> <to-file-range> @@@

    結合差分フォーマットのチャンクヘッダーには、(親の数 + 1)個の @ 文字があります。

従来の unified 差分フォーマット(2つのファイルAとBを、-(マイナス — Aには存在するがBでは削除)、+(プラス — AにはないがBに追加)、または " "(スペース — 変更なし)のプレフィックスを持つ単一の列で表示するもの)とは異なり、このフォーマットは2つ以上のファイル file1, file2,…​ を1つのファイルXと比較し、Xが各 fileN とどのように異なるかを示します。各 fileN ごとに1つの列が出力行に前置され、Xの行がそれとどのように異なるかを示します。

列Nの - 文字は、その行が fileN には存在するが結果には存在しないことを意味します。列Nの + 文字は、その行が結果には存在するが fileN にはその行がないこと(つまり、その親の観点から行が追加されたこと)を意味します。

上記の出力例では、関数シグネチャが両方のファイルから変更されています(そのため、file1とfile2の両方から2つの - 削除があり、さらに追加された1行がfile1またはfile2のどちらにも存在しないことを意味する ++ があります)。また、他の8行はfile1と同じですが、file2には存在しません(そのため、+ で始まる)。

git diff-tree -c で表示された場合、マージコミットの親とマージ結果を比較します(つまり、file1..fileN が親です)。git diff-files -c で表示された場合、未解決のマージ親2つと作業ツリーファイルを比較します(つまり、file1 はステージ2、別名「our version」、file2 はステージ3、別名「their version」です)。

その他の差分フォーマット

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

名前変更またはコピーを伴う変更を表示する場合、--stat 出力は、パス名の共通のプレフィックスとサフィックスを結合することで、パス名をコンパクトに整形します。例えば、arch/i386/Makefilearch/x86/Makefile に移動しつつ4行を変更する変更は、次のように表示されます。

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

git[1] スイートの一部

scroll-to-top