SYNOPSIS

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

DESCRIPTION

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

OPTIONS

-p
-u
--patch

パッチを生成します(セクション・タイトル "Generating patch text with -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

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

--patch-with-raw

-p --raw の同義語。

--indent-heuristic

diffハンクの境界をずらす(shift)ヒューリスティックを有効にして、パッチを読みやすくします。 これがデフォルトです。

--no-indent-heuristic

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

--minimal

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

--patience

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

--histogram

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

--anchored=<text>

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

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

行が比較元(source)と比較先(destination)の両方に存在し、かつ、1回だけ存在し、かつ、このテキストで始まる場合、このアルゴリズムは、その行が出力に削除または追加として表示されないようにします。内部で "patience diff" アルゴリズムを使用します。

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

diffアルゴリズムを選択します。その派生(variants)は以下のとおりです:

default, myers

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

minimal

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

patience

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

histogram

このアルゴリズムは、忍耐アルゴリズム(patience algorithm)を拡張して、「発生率の低い共通要素をサポート」(support low-occurrence common elements)します。

たとえば、 あなたが 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

ファイルの作成や削除( "new" または "gone" 。オプションでシンボリックリンクの場合は "+l" )、diffstatのモード変更(実行可能ビットを追加または削除する場合は、それぞれ "+x" または "-x" )など、拡張ヘッダー情報の要約を出力します。情報はファイル名部分とグラフ部分の間に置かれます。本機能は --stat の機能を含んでいます。

--numstat

--stat に似ていますが、プログラムで処理しやすい(machine friendly)ように、追加および削除された行数を10進表記とパス名で省略形なしで表示します。バイナリファイルの場合、 0 0 の代わりに2つの - を出力します。

--shortstat

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

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

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

changes

比較元(source)から削除された、または比較先(destination)に追加された行をカウントして、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

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

--patch-with-stat

-p --stat と同義語。

-z

--raw または --numstat または --name-only または --name-status が指定されている場合は パス名を変更せず、出力フィールドターミネータとしてNULLを使用してください。

このオプションがないと、構成変数 core.quotePath で説明されているように、 通常の文字以外(unusual characters)を含むパス名が引用符で囲まれます(git-config(1) 参照)。

--name-only

変更されたファイルの名前のみを表示します。 多くの場合、ファイル名はUTF-8でエンコードされます。 詳細については、 git-log(1) のマニュアルページにあるエンコーディングに関する議論(the discussion about encoding)を参照してください。

--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を示します。configオプションが設定されていない場合、デフォルトは 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 で色付けされます。 同様に、 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 に似ていますが、移動されたコードの重要でない部分の追加の調光(dimmed)が実行されます。隣接する2つのブロックの境界線は興味深いと見なされ、残りは興味深いものではありません。 dimmed_zebra は非推奨の同義語です。

--no-color-moved

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

--color-moved-ws=<modes>

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

no

移動行検出を実行するときに、空白(whitespace)を無視しない。

ignore-space-at-eol

行末(EOL)での空白(whitespace)の変更を無視します。

ignore-space-change

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

ignore-all-space

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

allow-indentation-change

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

--no-color-moved-ws

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

--word-diff[=<mode>]

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

color

変更された単語(word)を色のみを使用して強調表示します。 --color を意味します。

plain

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

porcelain

スクリプトの使用を目的とした特別な行ベースの形式を使用します。追加/削除/無変更については、通常の統一されたdiff形式で印刷され、行の先頭の +/-/` ` 文字で始まり、行の終わりまで続きます。入力の改行は、それ自体の行のチルダ ~ で表されます。

none

単語(word)のdiffを再度無効にします。

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

--word-diff-regex=<regex>

空白以外を単語と見なす代わりに、 <regex> を使用して単語が何であるかを決定します。また、すでに有効になっていない限り、この機能は --word-diff の機能を含んでいます。

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

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

正規表現は、diffドライバーまたは構成オプション(configuration option)を介して設定することもできます。 gitattributes(5) または git-config(1) を参照してください。これを指定すると、diffドライバーまたは構成設定(configuration settings)が明示的にオーバーライドされます。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>

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

--full-index

パッチ形式の出力を生成するときは、最初の一握りの文字(first handful of characters)の代わりに、「インデックス」行にイメージ前およびイメージ後の完全ブロブオブジェクト名を表示します。

--binary

--full-index に加えて、 git-apply で適用できるバイナリ差分を出力します。 --patch の機能を含んでいます。

--abbrev[=<n>]

完全な40バイトの16進オブジェクト名をdiff-raw形式の出力とdiff-treeヘッダー行に表示する代わりに、オブジェクトを一意に参照する、少なくとも <n> 桁の16進数の長さの最短のプレフィックスを表示します。diffパッチ出力形式では、 --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>]

名前の変更(renames)を検知する。 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 オプションは、コピーの元のファイルが同じ変更組(changeset)で変更された場合にのみコピーを検索します。このフラグにより、コマンドは変更されていないファイルをコピー元の候補として検査します。これは大規模なプロジェクトでは非常にコストのかかる操作であるため、注意して使用してください。 複数の -C オプションを指定しても同じ効果があります。

-D
--irreversible-delete

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

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

-l<num>

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

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

追加(Add)・コピー(Copy)・削除(Delete)・変更(Modify)・名前変更(Rename)されたファイル、タイプが変更されたファイル(T)、マージされていないファイル(U)、不明なファイル(X)、またはペアリングが壊れているファイル(B)のみを選択します。フィルタ文字(無しも含む)の任意の組み合わせを使用できます。 組み合わせに * (全てまたは無し)が追加されると、比較で他の基準に一致するファイルがある場合、すべてのパスが選択されます。 他の基準に一致するファイルがない場合、何も選択されません。

また、逆に、除外したい時はこれらの各大文字指定を小文字にして指定します。例えば --diff-filter=ad は、追加および削除されたパスを除外します。

注意:すべてのdiffがすべてのタイプを特徴とするわけではないことに注意してください。 たとえば、これらのタイプの検出(detection)が無効になっている場合、コピーされたエントリと名前変更されたエントリは表示されません。

-S<string>

ファイル内の指定の文字列(つまり、 addition 、deletion)の出現回数の差分を調べます。スクリプターが使用することを目的としています。

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

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

-G<regex>

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

-S<regex> --pickaxe-regex-G<regex> の違いを説明するために、同じファイル内で以下のdiffを使用してコミットすることを検討してください:

+    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> の変更を含むファイルだけでなく、その変更セット(changeset)のすべての変更を表示します。

--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> の前のファイルを出力から破棄するか(スキップして)、出力の最後に移動させます(ローテーションさせます)。 これらは主に git difftool コマンドを使用するために考案されたものであり、それ以外の場合はあまり役に立たない可能性があります。

-R

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

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

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

-a
--text

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

--ignore-cr-at-eol

比較を行うときは、行末のキャリッジリターン(carriage-return)を無視します。

--ignore-space-at-eol

行末(EOL)での空白(whitespace)の変更を無視します。

-b
--ignore-space-change

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

-w
--ignore-all-space

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

--ignore-blank-lines

全て空白の行の変更は無視します。

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

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

--inter-hunk-context=<lines>

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

-W
--function-context

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

--exit-code

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

--quiet

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

--ext-diff

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

--no-ext-diff

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

--textconv
--no-textconv

バイナリファイルを比較するときに、外部テキスト変換フィルターの実行を許可(または禁止)します。 詳細については、 gitattributes(5) を参照してください。textconvフィルターは通常、一方向の変換であるため、結果のdiffは人間の消費に適していますが、適用(apply)することはできません。このため、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/" の代わりに、指定した比較元プレフィックス(source prefix)を表示します。

--dst-prefix=<prefix>

"b/" の代わりに、指定した比較先プレフィックス(destination prefix)を表示します。

--no-prefix

比較元(source)または比較先(destination)のプレフィックスを表示しません。

--default-prefix

デフォルトの比較元(source)および比較先(destination)のプレフィックスを使用します("a/" と "b/")。通常、これは既にデフォルトではありますが、 diff.noprefix などの設定をオーバーライドするために使用されることがあります。

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

diffするツリーオブジェクトのID。

--cached

ディスク上のファイルはまったく考慮しないでください。

--merge-base

<tree-ish>を直接比較する代わりに、<tree-ish>とHEADの間のマージベースを使用してください。 <tree-ish>はコミットでなければなりません。

-m

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

Raw output format

git-diff-indexgit-diff-treegit-diff-filesgit 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" のモード。作成(creation)またはマージされていない(unmerged)場合は 000000

  3. 空白

  4. "dst" のモード。作成(creation)またはマージされていない(unmerged)場合は 000000

  5. 空白

  6. "src" のsha1。作成(creation)またはマージされていない(unmerged)場合は 0{40}

  7. 空白

  8. "dst" のsha1; 削除、またはマージされていない(unmerged)、または「ワーク・ツリーがインデックスと同期していない」場合は 0{40}

  9. 空白

  10. ステータスの後に、オプションの「スコア数」("score" number)が続きます

  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 で説明されているように、通常の文字以外(unusual characters)を含むパス名が引用符で囲まれます(git-config(1) 参照)。 -z を使用すると、ファイル名がそのまま出力され、行はNULバイトで終了します。

diff format for merges

"git-diff-tree" と "git-diff-files" と "git-diff --raw" は、 -c または --cc オプションを使用して、マージコミットに対してもdiff出力を生成できます。出力は、以下の点で上記の形式とは異なります:

  1. 親ごとにコロン(:)があります

  2. より多くの "src" モードと "src" sha1があります

  3. statusは、各親のステータス文字を連結したものです

  4. オプションの「スコア数」はありません

  5. ファイルのタブ区切りのパス名

-c および ` -cc` の場合、履歴のいずれかの側でファイルの名前が変更された場合でも、宛先(dst)または最終パスのみが表示されます。 --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

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

Generating patch text with -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 が使用されることはありません。

    名前変更/コピーが含まれる場合、 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/ プレフィックスは含まれません。

    類似インデックス(similarity index)は変更されていない行のパーセンテージであり、非類似インデックス(dissimilarity index)は変更された行のパーセンテージです。これは切り捨てられた整数であり、その後にパーセント記号が続きます。したがって、100%の類似インデックス値は2つの等しいファイルを表し、100%の非類似性は古いファイルから新しいファイルに移行された行がないことを意味します。

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

  3. 通常の文字でないキャラクタ(\"unusual\" characters)を含むパス名は、構成変数 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
  5. ハンクのヘッダーには、ハンクが適用される関数の名前が記載されています。特定の言語に合わせてこれを調整する方法の詳細については、 gitattributes(5) の "Defining a custom hunk-header" を参照してください。

Combined diff format

diffを生成するコマンドは、マージを表示するときに -c または --cc オプションを使用して「合成diff」(combined diff)を生成できます。これは git-diff(1) または git-show(1) でのマージを表示するときのデフォルトの形式です。 注意: これらのコマンドのいずれかに適切な --diff-merges オプションを指定して、特定の形式で差分を強制的に生成できることにも注意してください。

合成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> 行は、<mode> の少なくとも1つが他の <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 にフィードされるのを防ぎます。合成差分形式は、マージコミットの変更を確認するために作成されたものであり、適用されることを意図したものではありません。この変更は、拡張された「インデックス」ヘッダーの変更に似ています:

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

    合成diff形式のチャンクヘッダーには親の数+1の @ 文字があります。

従来の統一diff形式とは異なり、2つのファイルAとBが、 - (マイナスはAに表示されますが、Bでは削除されます) または + (プラスはAにはありませんが、Bには追加されます)、または " "(スペースは変更なし) プレフィックスを持つ単一の列で表示される場合、この形式は2つ以上のファイル file1, file2,… を1つのファイルXと比較し、Xが各 fileN とどのように異なるかを示します。ファイルNごとに1つの列が出力行の前に追加され、Xの行が出力行とどのように異なるかを示します。

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

上記の出力例では、関数のシグネチャが両方のファイルから見て変更されています(したがって、 file1 と file2 の両方から2つの - が削除され、さらに ++ が追加されたため、 file1 と file2 のどちらにも表示されません)。また、他の8行は file1 と同じですが、 file2 には表示されません(したがって、接頭辞として + が付けられます)。

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

other diff formats

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

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

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

--numstat オプションは diffstat(1) 情報を提供しますが、人間ではなくソフトウェアで読むのを容易にするように設計されています。 --numstat 出力のエントリは以下のようになります:

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

この形式は、左から右へ:

  1. 追加行数

  2. タブ

  3. 削除行数

  4. タブ

  5. パス名(おそらく rename/copy 情報を含む)

  6. 改行

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

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

これは:

  1. 追加行数

  2. タブ

  3. 削除行数

  4. タブ

  5. NUL(rename/copy された場合のみ存在します)

  6. プリイメージのパス名

  7. NUL(rename/copy された場合のみ存在します)

  8. ポストイメージのパス名(rename/copy された場合のみ存在します)

  9. NUL

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

OPERATING MODES

あなたはインデックスファイルを完全に信頼するか(--cached フラグを使用)、diffロジックにてstat状態と一致しないファイルを「仮変更」(tentatively changed)として表示するようにするかを選択できます。これらの操作はどちらも非常に便利です。

CACHED MODE

--cached が指定されている場合、あなたは以下のように問うことができます:

HEADと、現在のインデックスの内容(`git write-tree` を
使用して書き込むもの)との違いを見せてください

たとえば、あなたがあなたの作業ディレクトリで作業して、インデックス内のいくつかのファイルを更新し、コミットする準備ができました。あなたは何をコミットしようとしているかを正確に確認したいのですが、比較のために新しいツリーオブジェクトを作成する必要はありません。そのためには、あなたは以下のようにします。

git diff-index --cached HEAD

例: commit.c の名前を git-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

あなたは上記が名前変更(rename)であることが簡単にわかります。

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

したがって、 git diff-index --cached を実行することは、「コミット済みとしてすでにマークしたものと、前のツリーとの違い」を自問するときに実に役に立つのです。

NON-CACHED MODE

非キャッシュモードは別のアプローチを取り、 git write-tree + ` git diff-tree` でエミュレートできないという点で、2つのモードの中でより便利になる可能性があります。したがって、これがデフォルトのモードです。非キャッシュバージョンは以下のように問いかけます:

HEADと現在チェックアウトされているツリーの違いを
表示 - インデックスの内容や最新でないファイル

これは明らかに非常に役立つ質問です。何をコミットできるかがわかるからです。 この場合も、出力は 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を行うのではなく、作業ディレクトリ内のオブジェクトを直接確認する必要があることを意味します。

Note
このタイプの他のコマンドと同様に、 git diff-index は実際にはファイルの内容をまったく調べません。 つまり、 kernel/sched.c は実際には変更されておらず、触れた(touch)だけです。いずれの場合も、インデックスを同期させるには、 gitu pdate-index する必要があることに注意してください。
Note
「has been updated」(更新されました)と「is still dirty in the working directory」(作業ディレクトリでまだダーティです)というファイルが混在している場合があります。「更新された」ファイルには有効なsha1が表示され、「インデックスと同期していない」ファイルには常に特別なすべてゼロのsha1が表示されるため、どのファイルがどの状態にあるかをいつでも確認できます。

GIT

Part of the git(1) suite