Git
English ▾ トピック ▾ 最新バージョン ▾ git-diff-files 最終更新日: 2.46.0

NAME

git-diff-files - ワークツリーとインデックス内のファイルを比較します

SYNOPSIS

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

DESCRIPTION

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

OPTIONS

-p
-u
--patch

パッチを生成します( -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

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

--patch-with-raw

-p --raw の同義語です。

--indent-heuristic

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

--no-indent-heuristic

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

--minimal

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

--patience

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

--histogram

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

--anchored=<text>

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

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

ソースとデスティネーションの両方に存在し、一度しか存在せず、このテキストで始まる行がある場合、このアルゴリズムは、それが出力で削除または追加として表示されるのを防ごうとします。"patience diff" アルゴリズムを内部的に使用します。

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

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

defaultmyers

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

minimal

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

patience

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

histogram

このアルゴリズムはpatienceアルゴリズムを拡張して、「低頻度共通要素をサポート」します。

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

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

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

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

--compact-summary

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

--numstat

--statに似ていますが、追加および削除された行数を10進表記で表示し、略語を使用しないパス名を表示して、機械にとってより扱いやすくします。バイナリファイルの場合、0 0ではなく2つの-を出力します。

--shortstat

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

-X[<param1,param2,…​>]
--dirstat[=<param1,param2,…​>]

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

changes

ソースから削除された行、または宛先に追加された行を数えることによって、dirstat数値を計算します。これは、ファイル内の純粋なコードの移動量を無視します。言い換えれば、ファイル内の行を再配置することは、他の変更ほどカウントされません。これは、パラメータが指定されていない場合のデフォルトの動作です。

lines

通常の行ベースのdiff分析を実行し、削除/追加された行数を合計することで、dirstat数値を計算します。(バイナリファイルの場合、バイナリファイルには行の自然な概念がないため、代わりに64バイトのチャンクをカウントします)。これは、changes動作よりもコストのかかる--dirstat動作ですが、ファイル内の再配置された行を他の変更と同じくらいカウントします。結果の出力は、他の--*statオプションから得られるものと一貫しています。

files

変更されたファイル数を数えることで、dirstat 数を計算します。変更されたファイルは、dirstat 解析においてすべて同等にカウントされます。これは、ファイルの内容をまったく調べる必要がないため、計算コストが最も低い--dirstatの動作です。

cumulative

子ディレクトリの変更を親ディレクトリにもカウントします。cumulativeを使用する場合、報告されるパーセンテージの合計は100%を超える可能性があることに注意してください。デフォルト(非累積)の動作は、noncumulativeパラメータで指定できます。

<limit>

整数パラメータは、カットオフパーセンテージを指定します(デフォルトは3%)。このパーセンテージ未満の変更に寄与するディレクトリは、出力に表示されません。

例:次のコマンドは、変更されたファイルをカウントし、変更されたファイルの総量の10%未満のディレクトリを無視し、子ディレクトリの数を親ディレクトリに累積します: --dirstat=files,10,cumulative

--cumulative

--dirstat=cumulative の同義語です。

--dirstat-by-file[=<param1,param2>…​]

--dirstat=files,<param1>,<param2>…​ の同義語です。

--summary

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

--patch-with-stat

-p --statの同義語です。

-z

--raw--numstat--name-only、または--name-statusが指定されている場合、パス名を変更せず、NULを出力フィールドの終端記号として使用します。

このオプションがない場合、「特殊な」文字を含むパス名は、設定変数core.quotePathの説明に従って引用符で囲まれます(git-config[1]を参照)。

--name-only

変更後のツリーにある各変更ファイルの名前のみを表示します。ファイル名は多くの場合、UTF-8でエンコードされています。エンコーディングに関する詳細については、git-log[1]マニュアルページのエンコーディングに関する説明を参照してください。

--name-status

変更された各ファイルの名前と状態のみを表示します。状態文字の意味については、--diff-filterオプションの説明を参照してください。--name-onlyと同様に、ファイル名は多くの場合、UTF-8でエンコードされています。

--submodule[=<format>]

サブモジュールの違いを表示する方法を指定します。--submodule=shortを指定すると、短縮形式が使用されます。この形式は、範囲の先頭と末尾にあるコミットの名前のみを表示します。--submoduleまたは--submodule=logを指定すると、ログ形式が使用されます。この形式は、git-submodule[1]summaryのように範囲内のコミットを一覧表示します。--submodule=diffを指定すると、diff形式が使用されます。この形式は、コミット範囲間のサブモジュールコンテンツの変更のインラインdiffを表示します。デフォルトはdiff.submodule、または設定オプションが設定されていない場合は短縮形式です。

--color[=<when>]

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

--no-color

色の付いたdiffをオフにします。--color=neverと同じです。

--color-moved[=<mode>]

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

no

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

default

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

plain

ある場所で追加され、別の場所で削除された行は、color.diff.newMovedで色付けされます。同様に、color.diff.oldMovedは、diffの他の場所で追加された削除された行に使用されます。このモードは移動された行をすべて検出しますが、コードブロックが順列なしで移動されたかどうかをレビューで判断するにはあまり役立ちません。

blocks

20文字以上の英数字文字からなる移動されたテキストのブロックが貪欲に検出されます。検出されたブロックは、color.diff.{old,new}Movedの色を使用して塗りつぶされます。隣接するブロックは区別できません。

zebra

blocksモードと同様に移動されたテキストのブロックが検出されます。ブロックは、color.diff.{old,new}Movedの色またはcolor.diff.{old,new}MovedAlternativeを使用して塗りつぶされます。2つの色の間の変化は、新しいブロックが検出されたことを示します。

dimmed-zebra

zebraに似ていますが、移動されたコードの面白くない部分の追加の減光が行われます。隣接する2つのブロックの境界線は興味深いと見なされ、残りは面白くないと見なされます。dimmed_zebraは非推奨の同義語です。

--no-color-moved

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

--color-moved-ws=<modes>

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

no

移動検出を実行するときに空白を無視しません。

ignore-space-at-eol

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

ignore-space-change

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

ignore-all-space

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

allow-indentation-change

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

--no-color-moved-ws

移動検出を実行するときに空白を無視しません。これを使用して、設定を上書きできます。--color-moved-ws=noと同じです。

--word-diff[=<mode>]

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

color

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

plain

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

porcelain

スクリプトによる消費を目的とした特別な行ベースの形式を使用します。追加/削除/変更されていない実行は、通常の統一diff形式で出力され、行の先頭に+/-/` `文字で始まり、行の最後まで続きます。入力における改行は、独自の行にあるチルダ~で表されます。

none

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

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

--word-diff-regex=<regex>

空白以外の文字列を単語と見なすのではなく、<regex>を使用して単語を決定します。また、既に有効になっていない限り、--word-diffも意味します。

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

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

正規表現は、diffドライバまたは設定オプションを使用して設定することもできます(gitattributes[5]またはgit-config[1]を参照)。明示的に指定すると、diffドライバまたは設定を上書きします。diffドライバは設定を上書きします。

--color-words[=<regex>]

--word-diff=colorと(正規表現が指定されている場合)--word-diff-regex=<regex>と同等です。

--no-renames

設定ファイルがデフォルトとして指定していても、名前変更検出をオフにします。

--[no-]rename-empty

空のBLOBを名前変更元として使用するかどうか。

--check

変更によって競合マーカーまたは空白エラーが発生した場合に警告します。空白エラーと見なされるものは、core.whitespace設定によって制御されます。デフォルトでは、末尾の空白(空白のみで構成される行を含む)と、行の先頭のインデント内でタブ文字の直後に続くスペース文字は、空白エラーと見なされます。問題が見つかった場合は、ゼロ以外のステータスで終了します。--exit-codeとは互換性がありません。

--ws-error-highlight=<kind>

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

--full-index

パッチ形式の出力を生成する場合、「index」行に先頭のいくつかの文字ではなく、完全な前後のイメージBLOBオブジェクト名を表示します。

--binary

--full-indexに加えて、git-applyで適用できるバイナリdiffを出力します。--patchを意味します。

--abbrev[=<n>]

diff-raw形式の出力とdiff-treeヘッダー行で表示される40バイトの16進数オブジェクト名を完全なものではなく、オブジェクトを一意に参照するのに十分な長さの少なくとも<n>桁の16進数の最短プレフィックスを表示します。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の間の差分は出力しません。結果のパッチは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は、追加されたパスと削除されたパスを除外します。

すべてのdiffがすべてのタイプを備えているとは限りません。たとえば、これらのタイプの検出が無効になっている場合、コピーされたエントリと名前変更されたエントリは表示されません。

-S<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番目のパターン(ただし1番目ではない)に一致するパス名を持つすべてのファイルが次に出力され、以下同様です。どのパターンにも一致しないパス名を持つすべてのファイルは、ファイルの最後に暗黙的な一致するすべてのパターンがあるかのように、最後に出力されます。複数のパス名が同じランクを持っている場合(同じパターンに一致するが、それ以前のパターンには一致しない)、それらの相対的な出力順序は通常の順序です。

<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

比較を行う際に、行末のキャリッジリターンを無視します。

--ignore-space-at-eol

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

-b
--ignore-space-change

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

-w
--ignore-all-space

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

--ignore-blank-lines

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

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

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

--inter-hunk-context=<lines>

差分塊間のコンテキストを、指定された行数まで表示します。これにより、互いに近い塊が融合されます。デフォルトは`diff.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]を参照してください。テキスト変換フィルタは通常一方向の変換であるため、結果のdiffは人間が理解しやすいですが、適用することはできません。このため、テキスト変換フィルタはデフォルトでgit-diff[1]git-log[1]に対してのみ有効になり、git-format-patch[1]やdiff plumbingコマンドに対しては有効になりません。

--ignore-submodules[=<when>]

diffの生成において、サブモジュールの変更を無視します。<when>には、「none」、「untracked」、「dirty」、または「all」(デフォルト)のいずれかを指定できます。「none」を使用すると、追跡されていないファイルや変更されたファイルが含まれている場合、またはHEADがスーパープロジェクトに記録されているコミットと異なる場合に、サブモジュールが変更されたと見なされ、git-config[1]またはgitmodules[5]の`ignore`オプションの設定を上書きできます。「untracked」を使用すると、追跡されていないコンテンツのみを含む場合、サブモジュールはダーティと見なされません(ただし、変更されたコンテンツはスキャンされます)。「dirty」を使用すると、サブモジュールの作業ツリーへのすべての変更が無視され、スーパープロジェクトに格納されているコミットへの変更のみが表示されます(これは1.7.0までは動作していました)。「all」を使用すると、サブモジュールへのすべての変更が非表示になります。

--src-prefix=<prefix>

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

--dst-prefix=<prefix>

"b/"の代わりに指定されたデスティネーションプレフィックスを表示します。

--no-prefix

ソースまたはデスティネーションプレフィックスを表示しません。

--default-prefix

デフォルトのソースとデスティネーションプレフィックス("a/"と"b/")を使用します。これは、`diff.noprefix`、`diff.srcPrefix`、`diff.dstPrefix`、`diff.mnemonicPrefix`などの設定変数を上書きします(`git-config`(1)を参照)。

--line-prefix=<prefix>

出力の各行の先頭に追加のプレフィックスを付加します。

--ita-invisible-in-index

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

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

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

それぞれ「ベース」バージョン、「私たちのブランチ」、「彼らのブランチ」に対して差分を取ります。これらのオプションを使用すると、マージされたエントリの差分は表示されません。

デフォルトは、私たちのブランチ(-2)とクリーンに解決されたパスに対して差分を取ることです。-0オプションを指定すると、マージされていないエントリの差分出力を省略し、「Unmerged」のみを表示できます。

-c
--cc

ステージ2(私たちのブランチ)、ステージ3(彼らのブランチ)、および作業ツリーのファイルを比較し、`diff-tree`がこれらのフラグを使用してマージコミットを表示する方法と同様に、結合されたdiffを出力します。

-q

存在しないファイルについてもサイレントのままにします。

生の出力形式

"git-diff-index"、"git-diff-tree"、"git-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. `-z`オプションを使用する場合はLFまたはNULでレコードを終了します。

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

  • A:ファイルの追加

  • C:ファイルの新しいファイルへのコピー

  • D:ファイルの削除

  • M:ファイルのコンテンツまたはモードの変更

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

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

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

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

ステータス文字CとRは常にスコアに続いており(移動またはコピーのソースとターゲット間の類似性の割合を示しています)、ステータス文字Mは、ファイルの書き換えに対してスコア(不一致の割合を示しています)が続く場合があります。

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

:100644 100644 5be4a4a 0000000 M file.c

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

マージのdiff形式

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

  1. 各親にコロンがあります。

  2. "src"モードと"src"sha1がさらにあります。

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

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

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

`-c`と`--cc`では、ファイルが履歴のいずれかの側で名前変更された場合でも、宛先または最終パスのみが表示されます。`--combined-all-paths`を使用すると、各親のパス名に続いてマージコミットのパス名が示されます。

`--combined-all-paths`なしの`-c`と`--cc`の例

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM	desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM	bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR	phooey.c

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

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM	desc.c	desc.c	desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM	foo.sh	bar.sh	bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR	fooey.c	fuey.c	phooey.c

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

-pを使用したパッチテキストの生成

`-p`オプションを使用してgit-diff[1]git-log[1]git-show[1]git-diff-index[1]git-diff-tree[1]、またはgit-diff-files[1]を実行すると、パッチテキストが生成されます。`GIT_EXTERNAL_DIFF`および`GIT_DIFF_OPTS`環境変数(git[1]を参照)、および`diff`属性(gitattributes[5]を参照)を使用して、パッチテキストの作成をカスタマイズできます。

-pオプションが生成するものは、従来のdiff形式とはわずかに異なります。

  1. その前に、次のような「git diff」ヘッダーが付きます。

    diff --git a/file1 b/file2

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

    名前変更/コピーが関与する場合、file1file2はそれぞれ、名前変更/コピーのソースファイル名と、名前変更/コピーによって生成されたファイル名を表します。

  2. その後に、1つ以上の拡張ヘッダー行が続きます。

    old mode <mode>
    new mode <mode>
    deleted file mode <mode>
    new file mode <mode>
    copy from <path>
    copy to <path>
    rename from <path>
    rename to <path>
    similarity index <number>
    dissimilarity index <number>
    index <hash>..<hash> <mode>

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

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

    類似性インデックスは変更されていない行の割合であり、非類似性インデックスは変更された行の割合です。これは、パーセント記号の後に続く丸められた整数です。したがって、100%の類似性インデックス値は2つの等しいファイルのために予約されており、100%の非類似性は、古いファイルからの行が新しいファイルに含まれていないことを意味します。

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

  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. ハンクヘッダーには、ハンクが適用される関数の名前が記載されています。特定の言語に合わせてこれを調整する方法の詳細については、gitattributes[5]の「カスタムハンクヘッダーの定義」を参照してください。

結合diff形式

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

「結合diff」形式は次のようになります。

diff --combined describe.c
index fabadb8,cc95eb0..4866510
--- a/describe.c
+++ b/describe.c
@@@ -98,20 -98,12 +98,20 @@@
	return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
  }

- static void describe(char *arg)
 -static void describe(struct commit *cmit, int last_one)
++static void describe(char *arg, int last_one)
  {
 +	unsigned char sha1[20];
 +	struct commit *cmit;
	struct commit_list *list;
	static int initialized = 0;
	struct commit_name *n;

 +	if (get_sha1(arg, sha1) < 0)
 +		usage(describe_usage);
 +	cmit = lookup_commit_reference(sha1);
 +	if (!cmit)
 +		usage(describe_usage);
 +
	if (!initialized) {
		initialized = 1;
		for_each_ref(get_name);
  1. その前に、「git diff」ヘッダー(-cオプションを使用する場合)があります。

    diff --combined file

    または、これ(--ccオプションを使用する場合)のようになります。

    diff --cc file
  2. その後に、1つ以上の拡張ヘッダー行が続きます(この例は、2つの親を持つマージを示しています)。

    index <hash>,<hash>..<hash>
    mode <mode>,<mode>..<mode>
    new file mode <mode>
    deleted file mode <mode>,<mode>

    mode <mode>,<mode>..<mode>行は、少なくとも1つの<mode>が他のものと異なる場合にのみ表示されます。検出されたコンテンツの移動に関する情報(名前変更とコピーの検出)を含む拡張ヘッダーは、2つの<tree-ish>のdiffで使用するために設計されており、結合diff形式では使用されません。

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

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

    従来の統合diff形式の2行ヘッダーと同様に、/dev/nullは作成または削除されたファイルを信号します。

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

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

    この拡張形式は、名前変更またはコピーの検出がアクティブな場合に、異なる親のファイルの元の名前を確認できるようにするために役立ちます。

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

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

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

従来の統合diff形式では、-(マイナス—Aには表示されるがBでは削除される)、+(プラス—AにはないがBに追加される)、または" "(スペース—変更されていない)プレフィックスを持つ単一列で2つのファイルAとBが表示されますが、この形式は2つ以上のファイルfile1、file2、…を1つのファイルXと比較し、Xが各fileNとどのように異なるかを示します。各fileNの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、別名「彼らのバージョン」です)。

その他のdiff形式

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

名前変更またはコピーを含む変更を表示する場合、--stat出力は、パスの共通の接頭辞と接尾辞を組み合わせることで、パス名をコンパクトにフォーマットします。たとえば、4行を変更しながらarch/i386/Makefilearch/x86/Makefileに移動する変更は、次のように表示されます。

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