Git
English ▾ トピック ▾ 最新バージョン ▾ git-diff-index は 2.46.0 で最後に更新されました

NAME

git-diff-index - ツリーと作業ツリーまたはインデックスを比較する

SYNOPSIS

git diff-index [-m] [--cached] [--merge-base] [<common-diff-options>] <tree-ish> [<path>…​]

DESCRIPTION

ツリーオブジェクト内の blob のコンテンツとモードを、作業ツリー内の対応する追跡ファイル、またはインデックス内の対応するパスと比較します。<path> 引数が存在する場合、それらのパターンに一致するパスのみを比較します。それ以外の場合は、すべての追跡ファイルが比較されます。

OPTIONS

-p
-u
--patch

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

-s
--no-patch

diff メカニズムからのすべての出力を抑制します。デフォルトでパッチを表示する git show などのコマンドで、それらの出力を抑制したり、エイリアス内のコマンドラインで --patch--stat などのオプションの効果を打ち消したりする場合に役立ちます。

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

通常の3行の代わりに、<n>行のコンテキストで diff を生成します。--patch を暗示します。

--output=<file>

stdout の代わりに特定のファイルに出力します。

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

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

--raw

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

--patch-with-raw

-p --raw のシノニムです。

--indent-heuristic

パッチを読みやすくするために diff hunk の境界をシフトするヒューリスティックを有効にします。これがデフォルトです。

--no-indent-heuristic

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

--minimal

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

--patience

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

--histogram

「histogram diff」アルゴリズムを使用して diff を生成します。

--anchored=<text>

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

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

ソースとデスティネーションの両方に存在する行で、1回だけ存在し、このテキストで始まる場合、このアルゴリズムは出力で削除または追加として表示されないように試みます。内部的には「patience diff」アルゴリズムを使用します。

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

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

defaultmyers

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

minimal

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

patience

パッチを生成するときに「patience diff」アルゴリズムを使用します。

histogram

このアルゴリズムは、patience アルゴリズムを「低出現の共通要素をサポートする」ように拡張します。

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

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

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

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

--compact-summary

diffstat で、ファイルの作成または削除(「new」または「gone」、オプションでシンボリックリンクの場合は「+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

通常の行ベースの diff 分析を行い、削除/追加された行数を合計することで、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[=<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

変更された各ファイルの名前のみをポストイメージツリーに表示します。ファイル名は 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 を表示します。デフォルトは、diff.submodule または設定オプションが設定されていない場合は short 形式になります。

--color[=<when>]

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

--no-color

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

--color-moved[=<mode>]

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

no

移動された行は強調表示されません。

default

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

plain

ある場所で追加され、別の場所で削除された行は、color.diff.newMoved で色付けされます。同様に、diff の別の場所に追加された削除された行には 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=<modes>

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

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

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

color

色のみを使用して変更された単語を強調表示します。--color を暗黙的に指定します。

plain

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

porcelain

スクリプトによる消費を目的とした特別な行ベースの形式を使用します。追加/削除/変更なしの実行は、行の先頭に +/-/` ` 文字で始まり、行の終わりまで続く通常の unified diff 形式で印刷されます。入力の改行は、それ自身の行にあるチルダ ~ で表されます。

none

単語 diff を再び無効にします。

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

--word-diff-regex=<regex>

空白以外の実行を単語と見なす代わりに、単語を決定するために <regex> を使用します。また、既に有効になっていない限り、--word-diff を暗黙的に指定します。

<regex> に一致する重複しない箇所がすべて単語とみなされます。これらのマッチの間にあるものは空白とみなされ、差分を見つける目的では無視されます(!)。すべての非空白文字に一致させるためには、正規表現に |[^[:space:]] を追加すると良いでしょう。改行を含むマッチは、改行で暗黙的に切り捨てられます(!)。

たとえば、--word-diff-regex=. は各文字を単語として扱い、それに応じて文字単位で差分を表示します。

正規表現は、diffドライバまたは設定オプションで設定することもできます。 gitattributes[5] または git-config[1] を参照してください。明示的に指定すると、diffドライバまたは設定設定はすべて上書きされます。Diffドライバは、設定設定よりも優先されます。

--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 で適用できるバイナリdiffを出力します。--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% は、Git がファイルの 90% 以上が変更されていない場合、削除/追加のペアを名前変更と見なす必要があることを意味します。 % 記号がない場合、数値は、小数点が付いた分数として読み取られます。つまり、-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 オプションには、名前変更/コピーのサブセットを安価に検出できるいくつかの予備ステップと、残りのペアになっていないすべての宛先を関連するすべてのソースと比較する徹底的なフォールバック部分が含まれます。(名前変更の場合、残りのペアになっていないソースのみが関連し、コピーの場合、すべての元のソースが関連します。)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) のみを選択します。フィルター文字の任意の組み合わせ (なしを含む) を使用できます。組み合わせに * (All-or-none) が追加された場合、比較で他の条件に一致するファイルがある場合はすべてのパスが選択されます。他の条件に一致するファイルがない場合は何も選択されません。

また、これらの大文字を小文字にすることで除外できます。たとえば、--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> 内の glob パターンの順序によって決定されます。最初のパターンに一致するパス名を持つすべてのファイルが最初に出力され、2 番目のパターンに一致する(ただし最初のパターンには一致しない)すべてのファイルが次に出力されます。以下同様です。どのパターンにも一致しないパス名を持つすべてのファイルは、ファイルの末尾に暗黙的な総称一致パターンがあるかのように、最後に出力されます。複数のパス名が同じランクを持つ場合(同じパターンに一致するが、それ以前のパターンには一致しない場合)、それらの相互の出力順序は通常の順序になります。

<orderfile> は次のように解析されます。

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

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

  • それ以外の各行には、単一のパターンが含まれています。

パターンは、FNM_PATHNAME フラグなしで fnmatch(3) に使用されるパターンと同じ構文とセマンティクスを持ちます。ただし、最後のパス名コンポーネントを任意に削除した場合にパターンに一致する場合も、パス名はパターンに一致します。たとえば、パターン "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

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

-b
--ignore-space-change

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

-w
--ignore-all-space

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

--ignore-blank-lines

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

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

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

--inter-hunk-context=<lines>

指定された行数まで、diff の hunk 間のコンテキストを表示し、互いに近い hunk を融合します。デフォルトは、設定オプションが設定されていない場合は diff.interHunkContext または 0 です。

-W
--function-context

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

--exit-code

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

--quiet

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

--ext-diff

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

--no-ext-diff

外部 diff ドライバーを禁止します。

--textconv
--no-textconv

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

--ignore-submodules[=<when>]

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

--src-prefix=<prefix>

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

--dst-prefix=<prefix>

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

--no-prefix

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

--default-prefix

デフォルトのソースプレフィックスと宛先プレフィックス("a/" と "b/")を使用します。これにより、diff.noprefixdiff.srcPrefixdiff.dstPrefix、および diff.mnemonicPrefix などの構成変数(git-config(1) を参照)がオーバーライドされます。

--line-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] も参照してください。

<tree-ish>

比較対象となるツリーオブジェクトの ID。

--cached

ディスク上のファイルをまったく考慮しません。

--merge-base

<tree-ish> を直接比較する代わりに、<tree-ish> と HEAD の間のマージベースを使用します。<tree-ish> はコミットである必要があります。

-m

デフォルトでは、インデックスに記録されているがチェックアウトされていないファイルは、削除済みとして報告されます。このフラグを指定すると、git diff-index はチェックアウトされていないすべてのファイルが最新であると表示します。

Raw 出力形式

"git-diff-index"、"git-diff-tree"、"git-diff-files"、および "git diff --raw" からの 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. LF または -z オプションを使用している場合は NUL。レコードを終了します。

可能なステータス文字は次のとおりです。

  • A:ファイルの追加

  • C:ファイルを新しいファイルにコピー

  • D:ファイルの削除

  • M:ファイルの内容またはモードの変更

  • R:ファイルの名前変更

  • T:ファイルの種類(通常ファイル、シンボリックリンク、またはサブモジュール)の変更

  • U:ファイルが未マージ(コミットする前にマージを完了する必要があります)

  • X: "不明" な変更タイプ(おそらくバグです。報告してください)

ステータス文字 C および R の後には、常にスコアが続きます(移動またはコピーのソースとターゲット間の類似性のパーセンテージを示します)。ステータス文字 M の後には、ファイルのリライトのスコア(非類似性のパーセンテージを示す)が続く場合があります。

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

:100644 100644 5be4a4a 0000000 M file.c

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

マージの diff 形式

"git-diff-tree"、"git-diff-files"、および "git-diff --raw" は、-c または --cc オプションを使用すると、マージコミットの diff 出力も生成できます。出力は、次の点で上記で説明した形式と異なります。

  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

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

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

結合 diff は、すべての親から変更されたファイルのみをリストすることに注意してください。

-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]を参照)、およびdiff属性(gitattributes[5]を参照)を使ってカスタマイズできます。

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

  1. それは、次のような「git diff」ヘッダーで始まります。

    diff --git a/file1 b/file2

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

    リネーム/コピーが関係する場合、file1file2には、それぞれリネーム/コピーのソースファイル名と、リネーム/コピーによって生成されたファイル名が表示されます。

  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%は、古いファイルから新しいファイルに引き継がれた行がないことを意味します。

    index行には、変更前と変更後のblobオブジェクト名が含まれます。<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. Hunkヘッダーには、hunkが適用される関数の名前が記載されています。これを特定の言語に合わせる方法の詳細については、gitattributes[5]の「カスタムhunkヘッダーの定義」を参照してください。

結合されたdiffフォーマット

diffを生成するコマンドは、マージを表示するときに-cまたは--ccオプションを使用すると、結合されたdiffを生成できます。これは、git-diff[1]またはgit-show[1]でマージを表示する場合のデフォルトのフォーマットです。また、これらのコマンドに適切な--diff-mergesオプションを指定して、特定のフォーマットでdiffを強制的に生成することもできます。

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

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>
    new file mode <mode>
    deleted file mode <mode>,<mode>

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

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

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

    従来の統一されたdiffフォーマットの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にフィードするのを防ぐために変更されました。結合されたdiffフォーマットは、マージコミットの変更をレビューするために作成されたものであり、適用されることを意図したものではありません。変更は、拡張されたindexヘッダーの変更に似ています。

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

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

-(マイナス - Aに表示されるがBで削除)、+(プラス - AにないがBに追加)、または" "(スペース - 変更なし)のプレフィックスを持つ単一の列で2つのファイルAとBを示す従来の統一されたdiffフォーマットとは異なり、このフォーマットは、複数のファイルfile1、file2、...を1つのファイルXと比較し、Xが各fileNとどのように異なるかを示します。Xの行がfileNとどのように異なるかを記録するために、fileNごとに1つの列が出力行の先頭に付加されます。

列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、別名「私たちのバージョン」、file2はステージ3、別名「彼らのバージョン」です)。

その他のdiffフォーマット

--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つのパスを表示します。

操作モード

インデックスファイルを完全に信頼するか(--cachedフラグを使用)、diffロジックにステータス状態と一致しないファイルを「一時的に変更された」として表示するかを選択できます。これらの両方の操作は非常に役立ちます。

キャッシュモード

--cachedが指定されている場合、次のような問い合わせができます。

show me the differences between HEAD and the current index
contents (the ones I'd write using 'git write-tree')

たとえば、ワーキングディレクトリで作業し、インデックス内のいくつかのファイルを更新し、コミットする準備ができているとします。新しいツリーオブジェクトを作成して比較することなく、コミットしようとしている内容を正確に確認したい場合は、次のようにします。

git diff-index --cached HEAD

例:commit.cgit-commit.cにリネームし、update-indexを実行してインデックスファイルで有効にしたとします。git diff-filesは、インデックスファイルがワーキングディレクトリと一致するため、何も表示しません。しかし、git diff-indexを実行すると、次のようになります。

torvalds@ppc970:~/git> git diff-index --cached HEAD
:100644 000000 4161aecc6700a2eb579e842af0b7f22b98443f74 0000000000000000000000000000000000000000 D	commit.c
:000000 100644 0000000000000000000000000000000000000000 4161aecc6700a2eb579e842af0b7f22b98443f74 A	git-commit.c

上記がリネームであることが簡単にわかります。

実際、git diff-index --cachedは、実際にはgit write-treeを実行してそれを比較することと常に完全に同等であるはずです。ただし、これは、自分がどこにいるのかを確認したいだけの場合には、はるかに優れています。

したがって、git diff-index --cachedを実行することは、基本的には、「コミットするようにすでにマークしたものは何か、そして前のツリーとの違いは何か」と自問自答しているときに非常に役立ちます。

非キャッシュモード

「非キャッシュ」モードは異なるアプローチを取り、git write-tree + git diff-treeでエミュレートできないという点で、2つのうちより便利な可能性があります。したがって、それがデフォルトモードです。非キャッシュバージョンは、次の質問をします。

show me the differences between HEAD and the currently checked out
tree - index contents _and_ files that aren't up to date

これは明らかに非常に便利な質問でもあります。これは、コミットできるものを教えてくれるためです。繰り返しますが、出力は、git diff-tree -rの出力とまったく同じですが、ひねりがあります。

ひねりは、一部のファイルがインデックスと一致しない場合、それに対応するバックアップストアがないため、マジックの「すべてゼロ」sha1を使用してそれを表示することです。したがって、kernel/sched.cを編集したが、まだそれにgit update-indexを実行していないとします。新しい状態に関連付けられた「オブジェクト」はなく、次のようになります。

torvalds@ppc970:~/v2.6/linux> git diff-index --abbrev HEAD
:100644 100644 7476bb5ba 000000000 M	kernel/sched.c

つまり、ツリーが変更され、kernel/sched.cが最新ではなく、新しいものが含まれている可能性があることを示しています。すべてゼロのsha1は、実際のdiffを取得するには、オブジェクトからオブジェクトへのdiffを実行するのではなく、ワーキングディレクトリ内のオブジェクトを直接見る必要があることを意味します。

注意
このタイプの他のコマンドと同様に、git diff-indexは実際にはファイルのコンテンツをまったく調べません。したがって、kernel/sched.cは実際には変更されておらず、単にタッチしただけかもしれません。いずれにしても、インデックスを同期させるには、git update-indexを実行する必要があるという注意です。
注意
「更新された」として表示されるファイルと、「ワーキングディレクトリでまだダーティである」として表示されるファイルが混在している場合があります。「更新された」ファイルは有効なsha1を表示し、「インデックスと同期していない」ファイルは常に特別なすべてゼロのsha1を持つため、どちらの状態にあるかは常にわかります。

GIT

git[1]スイートの一部

scroll-to-top