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

名前

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

概要

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

説明

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

オプション

-p
-u
--patch

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

-s
--no-patch

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

diffstatを生成します。デフォルトでは、ファイル名部分には必要なだけのスペースが使用され、残りはグラフ部分に割り当てられます。最大幅はデフォルトでターミナル幅、ターミナルに接続されていない場合は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

変更された各ファイルのポストイメージツリーのファイル名のみを表示します。ファイル名はしばしば 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>always, never, または 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>

diffの 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> 桁の16進数からなる最短のプレフィックスを表示します。diff-patch出力フォーマットでは、--full-index が優先されます。つまり、--full-index が指定されている場合、--abbrev にかかわらず完全なブロブ名が表示されます。デフォルト以外の桁数は --abbrev=<n> で指定できます。

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

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

ファイルの完全な書き換えとなる変更を、テキスト的に一致するごくわずかな行を混ぜた一連の削除と挿入としてではなく、古いものをすべて削除し、新しいものをすべて挿入する単一の変更として扱います。そして、数値 <m>-B オプションのこの側面を制御します(デフォルトは60%)。-B/70% は、Gitがそれを完全な書き換えと見なすには、元の30%未満が結果に残っている必要があることを指定します(つまり、そうでなければ、結果のパッチはコンテキスト行を混ぜた一連の削除と挿入になります)。

-M と一緒に使用すると、完全に書き換えられたファイルもリネームのソースと見なされます(通常、-M は消滅したファイルのみをリネームのソースと見なします)。数値 <n>-B オプションのこの側面を制御します(デフォルトは50%)。-B20% は、ファイルのサイズの20%以上と比較して追加と削除を伴う変更が、別のファイルへのリネームの可能なソースとして選ばれる資格があることを指定します。

-M[<n>]
--find-renames[=<n>]

名前の変更を検出します。<n> が指定された場合、それは類似性インデックス(つまり、ファイルのサイズに対する追加/削除の量)のしきい値です。たとえば、-M90% は、ファイルの90%以上が変更されていない場合に、Gitが削除/追加のペアを名前の変更と見なすべきであることを意味します。% 記号がない場合、数値は小数として、小数点が表示される前に読み取られます。つまり、-M5 は0.5になり、-M50% と同じです。同様に、-M05-M5% と同じです。正確な名前の変更に検出を限定するには、-M100% を使用します。デフォルトの類似性インデックスは50%です。

-C[<n>]
--find-copies[=<n>]

名前変更だけでなく、コピーも検出します。--find-copies-harder も参照してください。<n> が指定されている場合、-M<n> と同じ意味を持ちます。

--find-copies-harder

パフォーマンス上の理由から、デフォルトでは -C オプションは、コピー元のファイルが同じチェンジセットで変更された場合にのみコピーを検出します。このフラグは、変更されていないファイルをコピー元の候補としてコマンドに調べさせます。これは大規模なプロジェクトでは非常に高価な操作であるため、注意して使用してください。複数の -C オプションを指定しても同じ効果があります。

-D
--irreversible-delete

削除のプレイメージを省略します。つまり、ヘッダのみを印刷し、プレイメージと /dev/null の差分は印刷しません。結果のパッチは 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)ファイルのみを選択します。フィルター文字の任意の組み合わせ(なしも含む)を使用できます。*(すべてまたはなし)が組み合わせに追加されると、比較で他の基準に一致するファイルがある場合、すべてのパスが選択されます。他の基準に一致するファイルがない場合、何も選択されません。

また、これらの大文字は小文字にすることで除外できます。例: --diff-filter=ad は追加および削除されたパスを除外します。

すべての差分がすべてのタイプを持つわけではないことに注意してください。たとえば、これらのタイプの検出が無効になっている場合、コピーおよび名前変更されたエントリは表示できません。

-S<string>

指定された <string> のファイル内の出現回数を変更する差分 (つまり、追加/削除) を検索します。スクリプト作成者向けです。

これは、コードの正確なブロック(構造体など)を探していて、そのブロックが最初に作成されて以来の履歴を知りたい場合に役立ちます。興味のあるブロックをプレイメージから -S に繰り返し渡し、ブロックの最初のバージョンが得られるまで続けます。

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

-G<regex>

パッチテキストに <regex> に一致する追加/削除行を含む差分を検索します。

-S<regex> --pickaxe-regex-G<regex> の違いを説明するために、同じファイル内の以下の差分を持つコミットを考えてみましょう。

+    return frotz(nitfol, two->ptr, 1, 0);
...
-    hit = frotz(nitfol, mf2.ptr, 1, 0);

git log -G"frotz\(nitfol" はこのコミットを表示しますが、git log -S"frotz\(nitfol" --pickaxe-regex は表示しません(その文字列の出現回数が変更されていないため)。

--text が指定されない限り、textconv フィルタがないバイナリファイルのパッチは無視されます。

詳細については、gitdiffcore[7]pickaxe エントリを参照してください。

--find-object=<object-id>

指定されたオブジェクトの出現回数を変更する差分を検索します。-S と同様ですが、引数が異なり、特定の文字列ではなく特定のオブジェクト ID を検索します。

オブジェクトはブロブまたはサブモジュールコミットにできます。git-log-t オプションを含意し、ツリーも検索します。

--pickaxe-all

-S または -G が変更を見つけた場合、<string> 内の変更を含むファイルだけでなく、その変更セット内のすべての変更を表示します。

--pickaxe-regex

-S に与えられた <string> を、マッチさせる拡張 POSIX 正規表現として扱います。

-O<orderfile>

出力におけるファイルの表示順序を制御します。これは diff.orderFile 設定変数(git-config[1]を参照)を上書きします。diff.orderFile をキャンセルするには、-O/dev/null を使用します。

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

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

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

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

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

パターンは 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 のハンク間のコンテキストを指定された<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.dstPrefixdiff.mnemonicPrefix などの設定変数を上書きします(git-config[1]を参照)。

--line-prefix=<prefix>

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

--ita-invisible-in-index

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

これらの共通オプションの詳細については、gitdiffcore[7]も参照してください。

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

それぞれ「ベース」バージョン、「our ブランチ」、または「their ブランチ」と比較します。これらのオプションを指定すると、マージされたエントリの差分は表示されません。

デフォルトでは、our ブランチ (-2) ときれいに解決されたパスと比較されます。オプション -0 を指定すると、未マージのエントリの差分出力を省略し、「Unmerged」とだけ表示できます。

-c
--cc

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

-q

存在しないファイルでもサイレントを維持

Raw 出力形式

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. ステータス。オプションの "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: 「不明な」変更タイプ (おそらくバグ、報告してください)

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

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

:100644 100644 5be4a4a 0000000 M file.c

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

マージの差分形式

git-diff-treegit-diff-filesgit-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形式

差分を生成するすべてのコマンドは、マージを表示するときに combined 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 diff形式は、-(マイナス — AにはあるがBでは削除)、+(プラス — AにはなくBに追加)、または " "(スペース — 変更なし)のプレフィックスを持つ1つの列で2つのファイルAとBを表示しますが、この形式は2つ以上のファイル file1, file2,…​を1つのファイルXと比較し、Xが各fileNとどのように異なるかを示します。各fileNごとに1つの列が出力行の前に付加され、Xの行がそれとどのように異なるかを示します。

列 N の - 文字は、その行がファイル N に存在するが、結果には存在しないことを意味します。列 N の + 文字は、その行が結果に存在し、ファイル N にはその行がないこと(言い換えれば、その親の観点から、その行が追加されたこと)を意味します。

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

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

その他の差分形式

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

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

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

--numstat オプションは diffstat(1) の情報を提供しますが、機械処理が容易になるように設計されています。--numstat 出力のエントリは次のようになります。

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

つまり、左から右へ

  1. 追加された行数;

  2. タブ;

  3. 削除された行数;

  4. タブ;

  5. パス名 (名前変更/コピー情報を含む場合あり);

  6. 改行。

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

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

つまり

  1. 追加された行数;

  2. タブ;

  3. 削除された行数;

  4. タブ;

  5. NUL (名前変更/コピーの場合にのみ存在);

  6. 事前イメージのパス名;

  7. NUL (名前変更/コピーの場合にのみ存在);

  8. 事後イメージのパス名 (名前変更/コピーの場合にのみ存在);

  9. NUL。

名前変更の場合、プレイメージパスの前に余分な NUL があるのは、出力を読み取るスクリプトが、先読みせずに現在のレコードが単一パスレコードか名前変更/コピーレコードかを判別できるようにするためです。追加および削除された行を読み取った後、NUL まで読み取るとパス名が得られますが、それが NUL であれば、レコードは2つのパスを示します。

GIT

git[1]スイートの一部

scroll-to-top