SYNOPSIS

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

DESCRIPTION

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

raw 入力行の間に単一の NUL バイトを stdin に書き込むことで、 (stdin のクローズを待たずに、)その時点までのファイル・ペアの diff を計算できます。 これらの diff のバッチを区切るために、 出力にも NUL バイトが書き込まれます。

このコマンドを使用することで、 従来の diff パイプラインを別々のステージに分割でき、 diff-pairs が出力段階として機能します。 他のコマンド(例: diff-tree)が、 入力として使用される raw diff 形式を計算するフロントエンドとして機能できます。

git diff-tree -p -M で一度に diff を計算する代わりに、 diff-tree でファイル・ペアとリネーム情報をブロブの diff なしで計算できます。 この出力を diff-pairs に渡すことで、 基になるブロブの diff を生成できます。 例えば以下のようにします:

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

リネーム情報を含めたツリー diff を事前に計算することで、 diff-pairs からのパッチ出力が、 潜在的に複数の呼び出しにわたって逐次計算されるようになります。

diff-pairs は現在 pathspec をサポートしていません。 pathspec による制限は、 入力として使用される raw diff を生成する上流のコマンドで行う必要があります。

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

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

OPTIONS

-p
-u
--patch

パッチを生成します([generate_patch_text_with_p] 参照)。

-s
--no-patch

diff 機構からの出力をすべて抑制します。 デフォルトでパッチを表示する git show のようなコマンドで出力を抑制したり、 コマンドラインのエイリアスで --patch--stat などのオプションの効果をキャンセルしたりする場合に便利です。

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

通常の3行ではなく、 <n> 行の内容で diff を生成します。 --patch の機能を含んでいます。

--output=<file>

stdout ではなく指定のファイルに出力します。

--output-indicator-new=<char>
--output-indicator-old=<char>
--output-indicator-context=<char>

生成されたパッチの新しい行、古い行、またはコンテキスト行を示すために使用される文字を指定します。 通常、それらはそれぞれ "+", "-", " " です。

--raw

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

--patch-with-raw

-p --raw の同義語。

--indent-heuristic

diffハンクの境界をずらす(shift)ヒューリスティックを有効にして、パッチを読みやすくします。 これがデフォルトです。

--no-indent-heuristic

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

--minimal

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

--patience

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

--histogram

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

--anchored=<text>

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

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

行が比較元(source)と比較先(destination)の両方に存在し、かつ、1回だけ存在し、かつ、 <text> で始まる場合、このアルゴリズムは、その行が出力に削除または追加として表示されないようにします。内部で「patience diff」アルゴリズムを使用します。

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

diffアルゴリズムを選択します。そのバリエーションは以下のとおりです:

default
myers

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

minimal

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

patience

パッチを生成する時に "patience diff" アルゴリズムを使います。

histogram

このアルゴリズムは、忍耐アルゴリズム(patience algorithm)を拡張して、「発生率の低い共通要素をサポート」(support low-occurrence common elements)します。

たとえば、 あなたが 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 )、 diffstat のモード変更(実行可能ビットを追加または削除する場合は、それぞれ +x または -x )など、 拡張ヘッダー情報の要約を出力します。 情報はファイル名部分とグラフ部分の間に置かれます。 本機能は --stat の機能を含んでいます。

--numstat

--stat に似ていますが、プログラムで処理しやすい(machine friendly)ように、追加および削除された行数を10進表記とパス名で省略形なしで表示します。バイナリファイルの場合、 0 0 の代わりに2つの - を出力します。

--shortstat

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

-X [<param>,...]
--dirstat[=<param>,...]

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

changes

比較元(source)から削除された、または比較先(destination)に追加された行をカウントして、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[=<param>,...]

--dirstat=files,<param>,... と同義語。

--summary

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

--patch-with-stat

-p --stat と同義語。

-z

--raw または --numstat または --name-only または --name-status が指定されている場合は パス名を変更せず、出力フィール・ターミネーターとしてNULLを使用してください。

このオプションがないと、構成変数 core.quotePath で説明されているように、 通常の文字以外(unusual characters)を含むパス名がクォートされます(git-config(1) 参照)。

--name-only

ポスト・イメージ・ツリー(post-image tree)に、 変更された各ファイルの名前のみを表示します。 多くの場合、ファイル名はUTF-8でエンコードされます。 詳細については、 git-log(1) のマニュアルページにあるエンコーディングに関する議論(the discussion about encoding)を参照してください。

--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を示します。configオプションが設定されていない場合、デフォルトは diff.submodule または short 形式です。

--color[=<when>]

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

--no-color

カラーdiffをオフにします。 --color=never と同じです。

--color-moved[=<mode>]

ソースコードの移動した行を別の色にします。 <mode>は、オプションが指定されていない場合はデフォルトで no になり、 モードが指定されていないオプションが指定されている場合は zebra になります。 モードは以下のいずれかでなければなりません:

no

移動行をハイライトしません。

default

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

plain

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

blocks

少なくとも20文字の英数字の移動テキストのブロックが貪欲に検出されます。検出されたブロックは、 color.diff.(old|new)Moved で設定した色のいずれかを使用して色付けされます。隣接するブロックを区別することはできません。

zebra

移動されたテキストのブロックは、 blocks モードの場合と同様に検出されます。 ブロックは、 color.diff.(old|new)Moved で設定した色または color.diff.(old|new)MovedAlternative で設定した色のいずれかを使用して色付けされます。 2つの色の間の変化は、新しいブロックが検出されたことを示します。

dimmed-zebra

zebra に似ていますが、移動されたコードの重要でない部分の追加の調光(dimmed)が実行されます。隣接する2つのブロックの境界線は興味深いと見なされ、残りは興味深いものではありません。 dimmed_zebra は非推奨の同義語です。

--no-color-moved

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

--color-moved-ws=<mode>,...

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

no

移動行検出を実行するときに、空白(whitespace)を無視しない。

ignore-space-at-eol

行末(EOL)での空白(whitespace)の変更を無視します。

ignore-space-change

空白(whitespace)の数の変更は無視してください。これは、行末の空白(whitespace)を無視し、1つ以上の空白文字(whitespace characters)の他のすべてのシーケンスを同等と見なします。

ignore-all-space

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

allow-indentation-change

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

--no-color-moved-ws

移動検出を実行するときは、空白(whitespace)を無視しないでください。これは、構成設定を上書きするために使用できます。 --color-moved-ws=no と同じです。

--word-diff[=<mode>]

デフォルトでは、単語は空白(whitespace)で区切られます。 以下の --word-diff-regex を参照してください。 <mode> のデフォルトは plain です。 <mode> は以下のいずれかである必要があります:

color

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

plain

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

porcelain

スクリプトの使用を目的とした特別な行ベースの形式を使用します。追加/削除/無変更については、通常の統一されたdiff形式で印刷され、行の先頭の "+"/"-"/" " 文字で始まり、行の終わりまで続きます。入力の改行は、それ自体の行のチルダ ~ で表されます。

none

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

注意: 最初のモードの名前にもかかわらず、有効になっている場合、すべてのモードで変更された部分を強調するために色が使用されることに注意してください。

--word-diff-regex=<regex>

空白以外を単語と見なす代わりに、 <regex> を使用して単語が何であるかを決定します。また、すでに有効になっていない限り、この機能は --word-diff の機能を含んでいます。

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

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

正規表現は、diffドライバーまたは構成オプション(configuration option)を介して設定することもできます。 gitattributes(5) または git-config(1) を参照してください。これを指定すると、diffドライバーまたは構成設定(configuration settings)が明示的にオーバーライドされます。diffドライバーは構成設定を上書きします。

--color-words[=<regex>]

--word-diff=color--word-diff-regex=<regex> を加えたものに相当します(正規表現が指定されている場合)。

--no-renames

構成ファイルにデフォルトで指定されている場合でも、名前変更の検出をオフにします。

--rename-empty
--no-rename-empty

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

--check

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

--ws-error-highlight=<kind>

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

--full-index

パッチ形式の出力を生成するときは、最初の一握りの文字(first handful of characters)の代わりに、「インデックス」行にイメージ前およびイメージ後の完全ブロブオブジェクト名を表示します。

--binary

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

--abbrev[=<n>]

完全な40バイトの16進オブジェクト名をdiff-raw形式の出力とdiff-treeヘッダー行に表示する代わりに、オブジェクトを一意に参照する、少なくとも <n> 桁の16進数の長さの最短のプレフィックスを表示します。diffパッチ出力形式では、 --full-index が優先されます。つまり、 --full-index が指定されている場合、 --abbrev に関係なく、完全なブロブ名が表示されます。デフォルト以外の桁数は、 --abbrev=<n> で指定できます。

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

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

これは、ファイルの完全な書き換えに相当する変更が、コンテキストとしてテキストで一致する非常に少数の行と混合された一連の削除と挿入としてではなく、古いものすべての単一の削除とそれに続く すべての新しいものを1回挿入し、数値 m が -B オプションのこの側面を制御します(デフォルトは60%)。 -B/70% は、Gitがそれを完全な書き換えと見なすために、元の30%未満が結果に残る必要があることを指定します(つまり、結果のパッチは、コンテキスト行と混合された一連の削除と挿入になります)。

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

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

名前の変更(renames)を検知する。 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 オプションは、コピーの元のファイルが同じ変更組(changeset)で変更された場合にのみコピーを検索します。このフラグにより、コマンドは変更されていないファイルをコピー元の候補として検査します。これは大規模なプロジェクトでは非常にコストのかかる操作であるため、注意して使用してください。 複数の -C オプションを指定しても同じ効果があります。

-D
--irreversible-delete

削除するプレイメージ(preimage)を省略します。つまり、ヘッダーのみを出力し、プレイメージと /dev/null の差分は出力しません。結果のパッチは、 patch または git apply で適用されることを意図していません。これは、変更後にテキストを確認することに集中したい人のためだけのものです。さらに、出力には明らかに、そのようなパッチを手動でも逆に適用するのに十分な情報が不足しているため、このようなオプション名になっています。

-B と併用する場合は、削除/作成ペアの削除部分のプリイメージ(preimage)も省略します。

-l<num>

-M および -C オプションには、名前変更/コピーのサブセットを安価に検出できるいくつかの準備手順が含まれ、その後に、残りのすべてのペアになっていない比較先(destinations)をすべての関連ソースと比較する徹底的なフォールバック部分が続きます。(名前の変更の場合、残りのペアになっていないソースのみが関係します。コピーの場合、すべての元のソースが関係します)。N個の、ソースと比較先の場合、この徹底的なチェックのコストは O(N^2) です。このオプションは、関係するソース/比較先ファイルの数が指定された数を超えた場合に、名前変更/コピー検出の完全な部分が実行されないようにします。デフォルトは diff.renameLimit です。 値0は無制限として扱われることに注意してください。

--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]

追加(Add)・コピー(Copy)・削除(Delete)・変更(Modify)・名前変更(Rename)されたファイル、タイプが変更されたファイル(T)、マージされていないファイル(U)、不明なファイル(X)、またはペアリングが壊れているファイル(B)のみを選択します。フィルタ文字(無しも含む)の任意の組み合わせを使用できます。 組み合わせに * (全てまたは無し)が追加されると、比較で他の基準に一致するファイルがある場合、すべてのパスが選択されます。 他の基準に一致するファイルがない場合、何も選択されません。

また、逆に、除外したい時はこれらの各大文字指定を小文字にして指定します。例えば --diff-filter=ad は、追加および削除されたパスを除外します。

注意:すべての diff がすべてのタイプを含むわけではないことに注意してください。 例えば、 コピーされたエントリや名前が変更されたエントリは、それらのタイプの検出(detection)が無効になっている場合には表示されません。

-S<string>

ファイル内の指定の <string> (つまり、 addition 、deletion)の出現回数の差分を調べます。 スクリプトで使用することを目的としています。

(構造体など)コードの正確なブロックを探していて、そのブロックが最初に作成されてからの履歴を知りたい場合に便利です。この機能を繰り返し使用して、プリイメージ(preimage)内の興味深いブロックを -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を検索します。

オブジェクトは、ブロブまたはサブモジュールのコミットにすることができます。 これは、 git-log-t オプションがツリーも探すことを意味します。

--pickaxe-all

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

--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> より前のファイルを出力から破棄(つまり、 そこまでスキップ)するか、 または、 それらのファイルを出力の末尾に移動させます。 これらオプションは主に git difftool コマンドでの使用目的のために考案されたものであり、そ れ以外の場合はあまり役に立たない可能性があります。

-R

2つの入力を交換します。 つまり、インデックスまたはディスク上のファイルとツリーの内容の違いを表示します。

--relative[=<path>]
--no-relative

プロジェクトのサブディレクトリから実行する場合、このオプションを使用して、ディレクトリ外の変更を除外し、それに関連するパス名を表示するように指示できます。サブディレクトリ(ベアリポジトリなど)にいない場合は、引数として <path> を指定することで、出力を作成するサブディレクトリに名前を付けることができます。 --no-relative は、 diff.relative 設定オプションと以前の --relative の両方を打ち消すために使用できます。

-a
--text

すべてのファイルをテキストとして扱います。

--ignore-cr-at-eol

比較を行うときは、行末のキャリッジリターン(carriage-return)を無視します。

--ignore-space-at-eol

行末(EOL)での空白(whitespace)の変更を無視します。

-b
--ignore-space-change

空白(whitespace)の数の変更は無視してください。これは、行末の空白(whitespace)を無視し、1つ以上の空白文字(whitespace characters)の他のすべてのシーケンスを同等と見なします。

-w
--ignore-all-space

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

--ignore-blank-lines

全て空白の行の変更は無視します。

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

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

--inter-hunk-context=<number>

指定された行数(<number>)までの diff ハンク間のコンテキストを表示し、 それによって互いに近いハンクを融合します。 デフォルトは diff.interHunkContext で、 構成オプションが設定されていない場合は 0 です。

-W
--function-context

関数全体を各変更のコンテキスト行として表示します。関数名は、 git diff がパッチハンクヘッダーを処理するのと同じ方法で決定されます(gitattributes(5) の「Defining a custom hunk-header」参照)。

--exit-code

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

--quiet

プログラムのすべての出力を無効にします。 --exit-code を含んでいます。 終了コード(exit code)が信頼できない、 つまり、 構成オプション diff.trustExitCode または diff.<driver>.trustExitCode または 環境変数 GIT_EXTERNAL_DIFF_TRUST_EXIT_CODE のいずれかが false の場合、 外部 diff ヘルパーの実行を無効にします。

--ext-diff

外部diffヘルパーの実行を許可します。 gitattributes(5) を使用して外部diffドライバーを設定する場合は、 git-log(1) およびその仲間と一緒にこのオプションを使用する必要があります。

--no-ext-diff

外部diffドライバーを禁止します。

--textconv
--no-textconv

バイナリファイルを比較するときに、外部テキスト変換フィルターの実行を許可(または禁止)します。 詳細については、 gitattributes(5) を参照してください。textconvフィルターは通常、一方向の変換であるため、結果のdiffは人間の消費に適していますが、適用(apply)することはできません。このため、textconvフィルターは、 git-diff(1) および git-log(1) に対してのみデフォルトで有効になりますが、 git-format-patch(1) またはdiff配管コマンドに対しては有効になりません。

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

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

--src-prefix=<prefix>

"a/" の代わりに、指定した比較元プレフィックス(source <prefix>)を表示します。

--dst-prefix=<prefix>

"b/" の代わりに、指定した比較先プレフィックス(destination <prefix>)を表示します。

--no-prefix

比較元(source)または比較先(destination)のプレフィックスを表示しません。

--default-prefix

デフォルトの比較元(source)および比較先(destination)のプレフィックスを使用します("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 で元に戻すことができます。どちらのオプションも実験的なものであり、将来削除される可能性があります。

--max-depth=<depth>

コマンドラインで指定された各パス指定(pathspec)について、 ディレクトリの深さを最大 <depth> 階層までしか辿らない。 値に -1 を指定すると制限なしとなる。 パス指定にワイルドカードを含んでいる場合は併用できない。 ツリーに foo/bar/baz が含まれている場合の例を以下に示す:

  • --max-depth=0 -- foo: foo

  • --max-depth=1 -- foo: foo/bar

  • --max-depth=1 -- foo/bar: foo/bar/baz

  • --max-depth=1 -- foo foo/bar: foo/bar/baz

  • --max-depth=2 -- foo: foo/bar/baz

パス指定(pathspec)を与えなかった場合、 深さの計算は「すべてのトップレベル項目を指定したのと同じ扱い」(all top-level entries were specified)になります。 注意: これは「作業ツリーのルートから辿る」とは異なり、 たとえ --max-depth=0 と指定しても foo 自体は表示されます。 この仕様のおかげで、 トップレベルのディレクトリ・ファイルのうち一部だけを指定した場合でも、 ちゃんと深さ制限を効かせ続けることができます。

注意: なお、 この --max-depth オプションが有効になるのは、 コミット(ツリー・オブジェクト)同士を diff する場合のみです。 作業ツリーやインデックス(ステージ)との diff では使用できないので注意してください。

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

Generating patch text with -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_DIFFGIT_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>

    ファイルモード(<mode>)は、 ファイル・タイプとファイル許可ビットを含む6桁の8進数として出力されます。

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

    類似インデックス(similarity index)は変更されていない行のパーセンテージであり、非類似インデックス(dissimilarity index)は変更された行のパーセンテージです。これは切り捨てられた整数であり、その後にパーセント記号が続きます。したがって、100%の類似インデックス値は2つの等しいファイルを表し、100%の非類似性は古いファイルから新しいファイルに移行された行がないことを意味します。

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

  3. 通常の文字でないキャラクタ("unusual" characters)を含むパス名は、構成変数 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) の「Defining a custom hunk-header」(カスタム・ハンク・ヘッダーの定義)を参照してください。

Combined diff format

diffを生成するコマンドは、マージを表示するときに -c または --cc オプションを使用して「合成diff」(combined diff)を生成できます。これは git-diff(1) または git-show(1) でのマージを表示するときのデフォルトの形式です。 注意: これらのコマンドのいずれかに適切な --diff-merges オプションを指定して、特定の形式で差分を強制的に生成できることにも注意してください。

合成diff形式は以下のようになります:

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

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

 +      if (get_sha1(arg, sha1) < 0)
 +              usage(describe_usage);
 +      cmit = lookup_commit_reference(sha1);
 +      if (!cmit)
 +              usage(describe_usage);
 +
        if (!initialized) {
                initialized = 1;
                for_each_ref(get_name);
  1. git diff ヘッダーがその前にあり、 以下のようになっています(-c オプションが使用されている場合):

    diff --combined file

    または、以下のようになります( --cc オプションが使用されている場合):

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

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

    "mode <mode>,<mode>..<mode>" 行は、 <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 にフィードされるのを防ぎます。合成差分形式は、マージコミットの変更を確認するために作成されたものであり、適用されることを意図したものではありません。この変更は、拡張された「インデックス」ヘッダーの変更に似ています:

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

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

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

GIT

Part of the git(1) suite