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

名前

git-diff-pairs - 提供されたブロブのペアのコンテンツとモードを比較する

概要

git diff-pairs -z [<diff-options>]

説明

標準入力で提供されたファイルペアの変更を表示します。このコマンドの入力は、git diff-tree -z -r --raw などのコマンドによって生成される NUL 終端の生出力形式である必要があります。デフォルトでは、標準入力が閉じると、出力される差分はパッチ形式で計算され表示されます。

標準入力が閉じるのを待つ代わりに、生入力行の間に単一の NUL バイトを標準入力に書き込むことで、その時点までのファイルペアの差分を計算できます。これらの差分のバッチ間を区切るために、NUL バイトも出力に書き込まれます。

このコマンドを使用すると、従来の差分パイプラインを個別のステージに分割でき、diff-pairs が出力フェーズとして機能します。 diff-tree などの他のコマンドは、入力として使用される生の差分形式を計算するためのフロントエンドとして機能する場合があります。

1つのステップで git diff-tree -p -M を介して差分を計算する代わりに、diff-tree はブロブの差分なしでファイルペアと名前変更情報を計算できます。この出力は、以下の例のように、基礎となるブロブの差分を生成するために diff-pairs に供給できます

git diff-tree -z -r -M $a $b |
git diff-pairs -z

名前変更情報を含むツリー差分を事前に計算することで、diff-pairs からのパッチ出力を、潜在的に複数回呼び出す過程で段階的に計算できます。

Pathspec は現在、diff-pairs ではサポートされていません。Pathspec の制限は、入力として使用される生の差分を生成するアップストリームコマンドによって実行されるべきです。

ツリーオブジェクトは現在入力としてサポートされておらず、拒否されます。

diff-pairs 入力における省略されたオブジェクトIDはサポートされていません。出力されるオブジェクトIDは --abbrev オプションを使用して省略できます。

オプション

-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 ) のような拡張ヘッダー情報の要約を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>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=. は各文字を単語として扱い、それに応じて文字ごとに差異を表示します。

正規表現は、差分ドライバまたは設定オプションを介して設定することもできます。 gitattributes[5] または git-config[1] を参照してください。明示的に指定すると、すべての差分ドライバまたは設定が上書きされます。差分ドライバは設定を上書きします。

--color-words[=<regex>]

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

--no-renames

設定ファイルがデフォルトで有効にしている場合でも、名前変更検出をオフにします。

--[no-]rename-empty

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

--check

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

--ws-error-highlight=<kind>

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

--full-index

パッチ形式出力を生成する際に、「index」行に最初の数文字ではなく、プレイメージとポストイメージの完全なブロブオブジェクト名を表示します。

--binary

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

--abbrev[=<n>]

差分生形式出力および差分ツリーヘッダー行に完全な40バイトの16進オブジェクト名を表示する代わりに、オブジェクトを一意に参照する最短のプレフィックスで、少なくとも <n> 桁の16進数長であるものを表示します。差分パッチ出力形式では、--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] の「Defining a custom hunk-header」を参照)。

--exit-code

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

--quiet

プログラムのすべての出力を無効にします。--exit-code を含意します。終了コードが信頼できない外部差分ヘルパーの実行を無効にします。つまり、それぞれの設定オプション 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] や差分プラグインコマンドでは有効になっていません。

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

-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> 行は、<mode> の少なくとも1つが残りのものと異なる場合にのみ表示されます。検出されたコンテンツ移動 (名前変更とコピー検出) に関する情報を含む拡張ヘッダーは、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)個の@文字があります。

単一の列に - (マイナス — Aには表示されるがBには削除される)、+ (プラス — Aには欠けているがBに追加される)、または " " (スペース — 変更なし) プレフィックスが表示される従来の 統一 差分形式とは異なり、この形式は2つ以上のファイル file1, file2, ... を1つのファイル X と比較し、X が各 fileN とどのように異なるかを示します。各 fileN ごとに1つの列が出力行の前に付けられ、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」です)。

GIT

git[1]スイートの一部

scroll-to-top