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

名前

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

概要

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

説明

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

オプション

-p
-u
--patch

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

-s
--no-patch

diff機構からの出力をすべて抑制します。デフォルトでパッチを表示する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

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

--no-indent-heuristic

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

--minimal

可能な限り最小の差分が生成されるように、余分な時間をかけます。

--patience

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

--histogram

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

--anchored=<text>

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

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

ソースとデスティネーションの両方に存在する行が1回のみ存在し、<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)などの拡張ヘッダー情報の要約をdiffstatで出力します。この情報はファイル名部分とグラフ部分の間に配置されます。--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

post-imageツリーで変更された各ファイルのファイル名のみを表示します。ファイル名は通常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

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

--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=.は各文字を単語として扱い、それに応じて文字ごとに差分を表示します。

正規表現は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>

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

--full-index

パッチ形式の出力を生成する際に、「index」行に最初の数文字ではなく、pre-imageおよびpost-imageブロブオブジェクトのフルネームを表示します。

--binary

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

--abbrev[=<n>]

diff-raw形式の出力およびdiff-treeヘッダー行で40バイトの完全な16進オブジェクト名を表示する代わりに、オブジェクトを一意に参照する最短のプレフィックスで、<n>桁以上の長さを持つものを表示します。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>の違いを説明するために、同じファイルに以下の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を検索する点で引数が異なります。

オブジェクトはblobまたはサブモジュールのコミットである場合があります。これは、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

プロジェクトのサブディレクトリから実行する場合、このオプションを使用すると、ディレクトリ外の変更を除外し、それに対する相対パス名を表示させることができます。サブディレクトリにいない場合(例:ベアリポジトリ内)、<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>

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

-W
--function-context

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

--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フィルターは通常一方向の変換であるため、生成されるdiffは人間が読むのに適していますが、適用することはできません。このため、textconvフィルターはデフォルトではgit-diff[1]git-log[1]でのみ有効になっており、git-format-patch[1]やdiffの配管コマンドでは有効になっていません。

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

diff生成時にサブモジュールの変更を無視します。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]も参照してください。

<tree-ish>

差分を取る対象のツリーオブジェクトのID。

--cached

ディスク上のファイルを一切考慮しません。

--merge-base

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

-m

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

生出力フォーマット

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. レコードを終端するためのLF、または-zオプション使用時は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バイトで終端されます。

マージのdiffフォーマット

git-diff-treegit-diff-files、およびgit-diff --rawは、マージコミットに対してもdiff出力を生成するために-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

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

-pオプションが生成するものは、従来のdiffフォーマットとはわずかに異なります。

  1. それに先立って、次のような「git diff」ヘッダーがあります。

    diff --git a/file1 b/file2

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

    名前変更/コピーが関与する場合、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>

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

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

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

    インデックス行には、変更前と変更後の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生成コマンドでも、マージ表示時に結合diffを生成するために-cまたは--ccオプションを使用できます。これは、git-diff[1]またはgit-show[1]でマージを表示する際のデフォルトフォーマットです。また、特定のフォーマットでdiffの生成を強制するために、これらのコマンドのいずれかに適切な--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>行は、少なくとも1つの<mode>が他のモードと異なる場合にのみ表示されます。検出されたコンテンツ移動(名前変更とコピー検出)に関する情報を含む拡張ヘッダーは、2つの<tree-ish>のdiffで機能するように設計されており、結合diffフォーマットでは使用されません。

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

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

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

    しかし、--combined-all-pathsオプションが提供された場合、2行のfrom-file/to-fileの代わりに、マージコミットの親の数Nに応じたN+1行のfrom-file/to-fileヘッダーが得られます。

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

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

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

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

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

従来のunified diffフォーマットは、ファイルAとBを単一の列で表示し、-(マイナス — Aには存在するがBからは削除)、+(プラス — Aには存在しないがBに追加)、または" "(スペース — 変更なし)のプレフィックスを持ちますが、このフォーマットは2つ以上のファイルfile1, file2,…​を1つのファイルXと比較し、Xが各fileNとどのように異なるかを示します。各fileNの列が出力行の先頭に付加され、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」)です)。

その他の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フラグを使用)、またはstatの状態と一致しないファイルを「暫定的に変更された」ものとして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