日本語 ▾ トピック ▾ 最新バージョン ▾ git-diff-index 最終更新 2.48.0

名前

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

概要

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

説明

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

オプション

-p
-u
--patch

パッチを生成します (Generating patch text with -p を参照)。

-s
--no-patch

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

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

通常の 3 行ではなく、<n> 行のコンテキストを持つ diff を生成します。--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

「ヒストグラム diff」アルゴリズムを使用して差分を生成します。

--anchored=<text>

「アンカー付き diff」アルゴリズムを使用して差分を生成します。

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

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

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

diff アルゴリズムを選択します。バリアントは以下の通りです

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 の同義語です。これは将来、より sensible なモードに変更される可能性があります。

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>

差分の context, old, 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> 桁の最短のプレフィックスを表示します。diff-patch 出力形式では、--full-index がより優先されます。つまり、--full-index が指定された場合、--abbrev に関係なく完全なBLOB名が表示されます。デフォルト以外の桁数は --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) のファイルのみを選択します。フィルター文字の任意の組み合わせ (なしも含む) を使用できます。* (すべてまたはなし) が組み合わせに追加されると、比較で他の基準に一致するファイルが1つでもある場合、すべてのパスが選択されます。他の基準に一致するファイルがない場合、何も選択されません。

また、これらの大文字は小文字にすることで除外できます。例: --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> 内のグロブパターンの順序によって決定されます。最初のパターンに一致するパス名を持つすべてのファイルが最初に出力され、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-relativediff.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 のハンク間のコンテキストを指定された<number>行まで表示し、互いに近いハンクを結合します。設定オプションが設定されていない場合、デフォルトはdiff.interHunkContextまたは0です。

-W
--function-context

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

--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 plumbingコマンドには有効化されていません。

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

<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. ステータス。オプションの "score" 数値が続く。

  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バイトで終端されます。

マージの差分形式

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オプションが生成するものは、従来の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%の非類似性指数は古いファイルからの行が新しいファイルに全く残っていないことを意味します。

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

  3. "特殊な"文字を含むパス名は、設定変数core.quotePathで説明されているように引用符で囲まれます(git-config[1]を参照)。

  4. 出力中のすべての file1 ファイルはコミット前のファイルを参照し、すべての file2 ファイルはコミット後のファイルを参照します。各変更を各ファイルに順番に適用するのは誤りです。たとえば、このパッチはaとbを交換します。

    diff --git a/a b/b
    rename from a
    rename to b
    diff --git a/b b/a
    rename from b
    rename to a
  5. Hunkヘッダは、そのhunkが適用される関数の名前を示します。特定の言語に合わせてこれを調整する方法の詳細については、gitattributes[5]の「カスタムhunkヘッダの定義」を参照してください。

統合diff形式

差分生成コマンドは、マージを表示する際に -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. -cオプションが使用された場合、次のような「git diff」ヘッダーが前に付きます。

    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>_ の差分で動作するように設計されており、結合差分形式では使用されません。

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

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

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

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

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

従来の _unified_ 差分形式が、- (マイナス — AにはあるがBでは削除された)、+ (プラス — AにはなくBに追加された)、または " " (スペース — 変更なし) のプレフィックスを持つ単一の列で2つのファイル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」) です)。

その他の差分形式

--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 フラグを使用)、または統計状態と一致しないファイルを「暫定的に変更された」ものとして差分ロジックに表示させるかを選択できます。これらの操作はどちらも非常に有用です。

キャッシュモード

--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は、実際の差分を取得するには、オブジェクト間の差分ではなく、作業ディレクトリ内のオブジェクトを直接確認する必要があることを意味します。

この種の他のコマンドと同様に、_git diff-index_ は実際にはファイルの内容を一切参照しません。したがって、kernel/sched.c は実際には変更されておらず、単に触っただけかもしれません。どちらの場合でも、インデックスを同期させるために _git update-index_ する必要があることを示すメモです。
「更新済み」と「作業ディレクトリでまだダーティ」の両方の状態のファイルが混在して表示されることがあります。どのファイルがどの状態にあるかは、常に識別できます。なぜなら、「更新済み」のファイルは有効な sha1 を示し、「インデックスと同期していない」ファイルは常に特別なオールゼロ sha1 を持つからです。

GIT

git[1]スイートの一部

scroll-to-top