SYNOPSIS

git diff [<options>] [<commit>] [--] [<path>...]
git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>...]
git diff [<options>] [--merge-base] <commit> [<commit>...] <commit> [--] [<path>...]
git diff [<options>] <commit>...<commit> [--] [<path>...]
git diff [<options>] <blob> <blob>
git diff [<options>] --no-index [--] <path> <path> [<pathspec>...]

DESCRIPTION

作業ツリーとインデックスまたはツリー間の変更、インデックスとツリー間の変更、2つのツリー間の変更、マージによる変更、2つのBLOBオブジェクト間の変更、ディスク上の2つのファイル間の変更を表示します。

git diff [<options>] [--] [<path>...]

この形式は、インデックス(次のコミットのステージング領域)に関連して行った変更を表示するためのものです。 言い換えれば、差異は、Gitにさらにインデックスに追加するように指示「可能な」ものですが、まだ追加していないものです。 git-add(1) を使用して、これらの変更をステージングできます。

git diff [<options>] --no-index [--] <path> <path> [<pathspec>...]

This form is to compare the given two paths on the filesystem. You can omit the --no-index option when running the command in a working tree controlled by Git and at least one of the paths points outside the working tree, or when running the command outside a working tree controlled by Git. This form implies --exit-code. If both paths point to directories, additional pathspecs may be provided. These will limit the files included in the difference. All such pathspecs must be relative as they apply to both sides of the diff.

git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>...]

この形式は、指定された<commit>に関連する次のコミットのためにステージングした変更を表示するためのものです。 通常、最新のコミットとの比較が必要になるため、<commit>を指定しない場合、デフォルトでHEADになります。 HEADが存在せず(つまり、まだブランチが無い)、かつ、<commit>が指定されていない場合、すべてのステージされた変更が表示されます。 --staged--cached の同義語です。

--merge-base が指定されている場合は、<commit>を使用する代わりに、<commit>とHEADのマージベースを使用します。 git diff --cached --merge-base Agit diff --cached $(git merge-base A HEAD) と同等です。

git diff [<options>] [--merge-base] <commit> [--] [<path>...]

この形式は、指定された<commit>に関連する作業ツリーでの変更を表示するためのものです。 HEADを使用して最新のコミットと比較したり、ブランチ名を使用して別のブランチの先端と比較したりできます。

--merge-base が指定されている場合は、<commit>を使用する代わりに、<commit>とHEADのマージベースを使用します。 git diff --merge-base Agit diff $(git merge-base A HEAD) と同等です。

git diff [<options>] [--merge-base] <commit> <commit> [--] [<path>...]

これは、2つの任意の<commit>間の変更を表示するためのものです。

--merge-base が指定されている場合は、「前」側(before side)の2つのコミットのマージベースを使用します。 git diff --merge-base A Bgit diff $(git merge-base A B) B と同等です。

git diff [<options>] <commit> <commit>... <commit> [--] [<path>...]

この形式は、マージコミットの結果を表示するためのものです。 最初にリストされている<commit>は、マージ自体である必要があります。 必要なリビジョンの組を生成する便利な方法は、 接尾辞 ^@^! を使用することです。 A がマージ・コミットの場合、 git diff A A^@git diff A^! と git show A はすべて同一の、 結合された diff (combined diff)を返します。

git diff [<options>] <commit>..<commit> [--] [<path>...]

これは、 2つの任意の <commit> 間の変更を表示するためのです。 上記の .. なしの形式と同義です。 片側の <commit> を省略すると、 代わりに HEAD を使用した場合と同じ効果があります。

git diff [<options>] <commit>...<commit> [--] [<path>...]

この形式は、両方の<commit>の共通の祖先から開始して、2番目の<commit>を含むブランチの変更を表示するためのものです。 git diff A...Bgit diff $(git merge-base A B) B と同等です。 <commit> のどちらかを省略でき、 そうすると、 代わりに HEAD を使用するのと同じ効果があります。

念のために書いておくと、 上記の説明の <commit> は、 --merge-base の場合と .. 表記を使った最後の2つの形式を除いて、 すべて任意の <tree> にすることができます。 対象となるツリーは、 AUTO_MERGE という名前の ref によって指されるツリーです。 これは、 マージ競合が発生したときに ort マージ戦略によって書き込まれます(git-merge(1) 参照)。 作業ツリーと AUTO_MERGE を比較すると、 テキストの競合を解決するためにこれまでに加えた変更が表示されます(下記例参照)。

<commit>を綴る方法のより完全なリストについては、 gitrevisions(7) の「SPECIFYING REVISIONS」セクションを参照してください。 ただし、 diff は範囲ではなく2つの「エンドポイント」を比較することであり、その範囲表記(<commit>..<commit><commit>...<commit>)は、 gitrevisions(7) の「SPECIFYING RANGES」セクションで定義されている範囲を意味するものではありません。

git diff [<options>] <blob> <blob>

この形式は、2つのBLOBオブジェクトの生のコンテンツの違いを表示するためのものです。

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 のいずれかになります。 color.uicolor.diff 構成設定で 変更できます。

--no-color

カラーdiffをオフにします。 これは、構成設定(configuration settings)を上書きするために使用できます。 --color=never と同じです。

--color-moved[=<mode>]

ソースコードの移動した行を別の色にします。 これは、 diff.colorMoved 構成設定によって変更できます。 <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 の移動検出を実行するときに空白を無視する方法を設定します。 diff.colorMovedWS 構成設定で設定できます。 これらのモードは、コンマ区切りのリストとして指定できます:

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

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

作業ツリーと以下を比較します

  • -1 または --base の場合、 「ベース」バージョン(ステージ #1)と比較します

  • -2 または --ours の場合、「our ブランチ」(ステージ #2)と比較します

  • -3 または --theirs の場合「their ブランチ」(ステージ #3)と比較します

インデックスには、マージされていないエントリの場合、つまり競合を解決している場合にのみ、これらのステージが含まれます。 詳細については、 git-read-tree(1) の「3-Way Merge」セクションを参照してください。

-0

マージされていないエントリのdiff出力を省略し、「Unmerged」とだけ表示します。 作業ツリーをインデックスと比較する場合にのみ使用できます。

<path>...

<paths>パラメータを指定すると、diffを名前付きパスに制限するために使用されます(あなたはディレクトリ名を指定して、その下にあるすべてのファイルのdiffを取得できます)。

Raw output format

git-diff-indexgit-diff-treegit-diff-filesgit 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" のモード。作成(creation)またはマージされていない(unmerged)場合は 000000

  3. 空白

  4. "dst" のモード。作成(creation)またはマージされていない(unmerged)場合は 000000

  5. 空白

  6. "src" のsha1。作成(creation)またはマージされていない(unmerged)場合は 0{40}

  7. 空白

  8. "dst" のsha1; 削除、またはマージされていない(unmerged)、または「ワーク・ツリーがインデックスと同期していない」場合は 0{40}

  9. 空白

  10. ステータスの後に、オプションの「スコア数」("score" number)が続きます

  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 で説明されているように、通常の文字以外(unusual characters)を含むパス名が引用符で囲まれます(git-config(1) 参照)。 -z を使用すると、ファイル名がそのまま出力され、行はNULバイトで終了します。

diff format for merges

git-diff-treegit-diff-filesgit-diff --raw は、 -c または --cc オプションを使用して、マージコミットに対してもdiff出力を生成できます。出力は、以下の点で上記の形式とは異なります:

  1. 親ごとにコロン(:)があります

  2. より多くの "src" モードと "src" sha1があります

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

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

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

-c および ` -cc` の場合、履歴のいずれかの側でファイルの名前が変更された場合でも、宛先(dst)または最終パスのみが表示されます。 --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

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

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、別名「彼らのバージョン」です)。

other diff formats

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

名前の変更またはコピーを伴う変更を表示する場合、 --stat 出力は、パス名の共通のプレフィックスとサフィックスを組み合わせることにより、パス名をコンパクトにフォーマットします。 たとえば、4行を変更(modify)しながら arch/i386/Makefilearch/x86/Makefile に移動(move)する変更(change)は、次のように表示されます:

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

--numstat オプションは diffstat(1) 情報を提供しますが、人間ではなくソフトウェアで読むのを容易にするように設計されています。 --numstat 出力のエントリは以下のようになります:

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

この形式は、左から右へ:

  1. 追加行数

  2. タブ

  3. 削除行数

  4. タブ

  5. パス名(おそらく rename/copy 情報を含む)

  6. 改行

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

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

これは:

  1. 追加行数

  2. タブ

  3. 削除行数

  4. タブ

  5. NUL(rename/copy された場合のみ存在します)

  6. プリイメージのパス名

  7. NUL(rename/copy された場合のみ存在します)

  8. ポストイメージのパス名(rename/copy された場合のみ存在します)

  9. NUL

名前が変更された場合のプリイメージパスの前の追加の NUL は、出力を読み取るスクリプトが、先読みせずに、読み取られている現在のレコードがシングルパスレコードであるか、名前変更/コピーレコードであるか、を判断できるようにするためです。追加および削除された行を読み取った後、 NUL まで読み取るとパス名が生成されますが、それが NUL の場合、レコードには2つのパスが表示されます。

EXAMPLES

あなたの作業ツリーを確認するさまざまな方法
$ git diff            <1>
$ git diff --cached   <2>
$ git diff HEAD       <3>
$ git diff AUTO_MERGE <4>
  1. 次のコミットのためにまだステージングされていない作業ツリーの変更。

  2. インデックスと最後のコミットの間の変更。 -a オプションなしで git commit を実行した場合にコミットする内容です。

  3. 最後のコミット以降の作業ツリーの変更。 git commit -a を実行した場合にコミットする内容です。

  4. 作業ツリーで、 これまでにテキストの競合を解決するために行った変更。

任意のコミット間の比較
$ git diff test            <1>
$ git diff HEAD -- ./test  <2>
$ git diff HEAD^ HEAD      <3>
  1. 現在のブランチの先端を使用する代わりに、「テスト」ブランチの先端と比較してください。

  2. 「test」ブランチの先端と比較する代わりに、現在のブランチの先端と比較しますが、比較をファイル「test」に限定します。

  3. 最後のコミットと、最後のコミットのその前のバージョンを比較します。

ブランチ間の比較
$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
  1. topicの先端とmasterブランチの間の変更。

  2. 同上。

  3. topicブランチが開始されてからmasterブランチで発生した変更。

diff 出力の制限
$ git diff --diff-filter=MRC            <1>
$ git diff --name-status                <2>
$ git diff arch/i386 include/asm-i386   <3>
  1. 変更、名前変更、コピーのみを表示し、追加や削除は表示しません。

  2. 名前と変更の性質のみを表示し、実際の差分出力は表示しません。

  3. diff出力を名前付きサブツリーに制限します。

diff出力をこねくりまわす(muging)
$ git diff --find-copies-harder -B -C  <1>
$ git diff -R                          <2>
  1. 名前の変更、コピー、完全な書き換えを見つけるために余分なサイクルを費やします(非常に高価です)。

  2. 逆のdiffを出力します。

CONFIGURATION

このセクションの以下のすべては、 git-config(1) ドキュメントの抜粋です。 内容は git-config(1) ドキュメント にあるものと同一です:

diff.autoRefreshIndex

git diff を使用して作業ツリーファイルと比較する場合、統計のみの変更を変更されたものと見なさない。代わりに、サイレントに git update-index --refresh を実行して、ワークツリーの内容がインデックスの内容と一致するパスの、キャッシュされた統計情報を更新します。このオプションのデフォルトはtrueです。注意: これは git diff 磁器コマンドにのみ影響し、 git diff-files などの下位レベルのdiffコマンドには影響しないことに注意してください。

diff.dirstat

git diff や、 そのファミリーに対する --dirstat オプションの デフォルトの動作を指定する、 --dirstat パラメータのカンマ区切りのリスト。 デフォルトは(--dirstat=<param>,... を使用して) コマンドラインでオーバーライドできます。 フォールバックのデフォルトは changes,noncumulative,3 です(diff.dirstat によって変更されていない限り)。 以下のパラメータを使用できます:

changes

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

lines

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

files

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

cumulative

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

<limit>

整数パラメーターは、カットオフパーセント(デフォルトでは3%)を指定します。変更への貢献がこの割合より少ないディレクトリは出力に表示されません。

例: 変更されたファイルの総数の10%未満のディレクトリを無視し、親ディレクトリに子ディレクトリの数を累積しながら、変更されたファイルをカウントする: files,10,cumulative

diff.statNameWidth

--stat 出力でファイル名部分の幅を制限します。設定されている場合、 format-patch を除く --stat 出力を生成するすべてのコマンドに適用されます。

diff.statGraphWidth

--stat 出力でグラフ部分の幅を制限します。設定されている場合、 format-patch を除く --stat 出力を生成するすべてのコマンドに適用されます。

diff.context

デフォルトの 3 ではなく <n> 行のコンテキストで差分を生成します。 この値は -U オプションによってオーバーライドされます。

diff.interHunkContext

指定された行数までのdiffハンク間のコンテキストを表示し、それによって互いに近いハンクを融合します。この値は、 --inter-hunk-context コマンドラインオプションのデフォルトとして機能します。

diff.external

この構成変数が設定されている場合、diffの生成は、内部のdiff機構を使用して実行されるのではなく、指定されたコマンドを使用して実行されます。 ‘GIT_EXTERNAL_DIFF’ 環境変数でオーバーライドできます。このコマンドは、 git(1) の「git Diffs」で説明されているパラメーターを使用して呼び出されます。 注意: ファイルのサブセットでのみ外部diffプログラムを使用する場合は、代わりに gitattributes(5) を使用することをお勧めします。

diff.trustExitCode

このブール値が true に設定されている場合、 diff.external コマンドは、 diff(1) のように、 入力ファイル達が等しいとみなされる場合は終了コード 0 を返し、 異なるとみなされる場合は 1 を返すことが期待されます。 これがデフォルトである false に設定されている場合、 コマンドは入力ファイル達が等しいかどうかに関係なく終了コード 0 を返すことが期待されます。 これら以外終了コードがあると Git は致命的なエラー(fatal error)を報告します。

diff.ignoreSubmodules

--ignore-submodules のデフォルト値を設定します。これは git diff 磁器コマンドにのみ影響し、 git diff-files などの下位レベルの diff コマンドには影響しないことに注意してください。 git checkoutgit switch も、コミットされていない変更を報告するときにこの設定を尊重します。 all に設定すると、 --ignore-submodules コマンドラインオプションを使用してオーバーライドされない限り、 status.submoduleSummary が設定されている場合、通常は git commit および git status で表示されるサブモジュールの概要が無効になります。 git submodule コマンドは、この設定の影響を受けません。 デフォルトでは、これは untracked に設定されているため、追跡されていないサブモジュールはすべて無視されます。

diff.mnemonicPrefix

設定されている場合、 git diff は、比較対象に応じて標準の a/b/ とは異なるプレフィックスのペアを使用します。この構成が有効な場合、逆差分出力でもプレフィックスの順序が入れ替わります:

git diff

(i)ndex と (w)ork tree を比較

git diff HEAD

(c)ommit と (w)ork tree を比較

git diff --cached

(c)ommit と (i)ndex を比較

git diff HEAD:<file1> <file2>

(o)bject と (w)ork tree エンティティを比較

git diff --no-index <a> <b>

2つの非git項目 <a><b> を比較

diff.noPrefix

設定されている場合、 git diff は送信元または宛先のプレフィックスを表示しません。

diff.srcPrefix

設定されている場合、 git diff はこのソース・プレフィックスを使用します。 デフォルトは a/ です。

diff.dstPrefix

設定されている場合、 git diff はこの宛先プレフィックスを使用します。 デフォルトは b/ です。

diff.relative

true に設定すると、 git diff はディレクトリ外の変更を表示せず、 現在のディレクトリへの相対的なパス名を表示します。

diff.orderFile

diff 内でファイルを並べ替える方法を示すファイル。 詳細は -O オプションを参照してください。 diff.orderFile が相対パス名の場合、 作業ツリーの最上位を基準とした相対パス名として扱います。

diff.renameLimit

コピー/名前変更 の検出の徹底的な部分で考慮するファイルの数。 git diff-l オプションと同等です。 設定されていない場合、 デフォルト値は現在 1000 です。 この設定は、 名前変更の検出がオフになっている場合は効果がありません。

diff.renames

Gitが名前の変更を検出するかどうかとその方法。 false に設定すると、 名前変更の検出が無効になります。 true に設定すると、 基本的な名前変更の検出が有効になります。 copies または copy に設定されている場合、 Gitはコピーも検出します。 デフォルトは true です。 注意: これは git-diff(1)git-log(1) のような git diff 磁器コマンドにのみ影響し、 git-diff-files(1) などの下位レベルのコマンドには影響しないことに注意してください。

diff.suppressBlankEmpty

空の出力行の前にスペースを印刷する標準的な動作を禁止するブール値。デフォルトは false です。

diff.submodule

サブモジュールの違いを表示する形式を指定します。 short 形式は、 範囲の最初と最後にコミットの名前を表示するだけです。 log 形式は、 git-submodule(1)summary のように範囲内のコミットをリストします。 diff 形式は、 サブモジュールの変更された内容のインライン diff を示します。 デフォルトは short です。

diff.wordRegex

単語ごとの差の計算を実行するときに「単語」(word)とは何かを判別するために使用されるPOSIX拡張正規表現。正規表現に一致する文字シーケンスは「単語」(words)であり、他のすべての文字は*無視できる*空白(whitespace)です。

diff.<driver>.command

カスタムdiffドライバーコマンド。詳細については gitattributes(5) を参照してください。

diff.<driver>.trustExitCode

このブール値が true に設定されている場合、 diff.<driver>.command コマンドは、 diff(1) のように、 入力ファイル達が等しいとみなされる場合は終了コード 0 を返し、 異なるとみなされる場合は 1 を返すことが期待されます。 これがデフォルトである false に設定されている場合、 コマンドは入力ファイル達が等しいかどうかに関係なく終了コード 0 を返すことが期待されます。 これら以外の終了コードがあると、 Git は致命的なエラー(fatal error)を報告します。

diff.<driver>.xfuncname

diffドライバーがハンクヘッダーを認識するために使用する必要がある正規表現。内蔵パターンを使用することもできます。詳細については gitattributes(5) を参照してください。

diff.<driver>.binary

このオプションを true に設定すると、 diff ドライバーはファイルをバイナリとして処理します。 詳細については gitattributes(5) を参照してください。

diff.<driver>.textconv

ファイルのテキスト変換バージョンを生成するためにdiffドライバーが呼び出す必要のあるコマンド。変換の結果は、人間が読める形式のdiffを生成するために使用されます。詳細については gitattributes(5) を参照してください。

diff.<driver>.wordRegex

diffドライバーが単語(words)を1行に分割するために使用する必要がある正規表現。詳細については gitattributes(5) を参照してください。

diff.<driver>.cachetextconv

このオプションを true に設定すると、 diff ドライバーはテキスト変換出力をキャッシュするようになります。 詳細については gitattributes(5) を参照してください。

diff.indentHeuristic

このオプションを false に設定すると、パッチを読みやすくするためにdiffハンク境界をシフトするデフォルトのヒューリスティックが無効になります。

diff.algorithm

diffアルゴリズムを選択します。 派生形は以下のとおりです:

default
myers

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

minimal

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

patience

パッチを生成するときは、patience diff(忍耐差分)アルゴリズムを使用してください。

histogram

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

diff.wsErrorHighlight

差分の context または old または `new 行の空白エラー(whitespace errors)を強調表示します。複数の値はコンマで区切られ、 none は前の値をリセットし、 default はリストを new にリセットし、 allold,new,context の省略形です。空白のエラー(whitespace errors)は color.diff.whitespace で色分けされています。コマンドラインオプション --ws-error-highlight=<kind> はこの設定を上書きします。

diff.colorMoved

有効な <mode> または true 値に設定すると、 差分内の移動された行は異なる色で表示されます。 有効なモードの詳細については、 --color-moved を参照してください。 単純に true に設定すると、 デフォルトのカラー・モード が使用されます。 false に設定すると、 移動した行には色が付きません。

diff.colorMovedWS

このオプションは、 例えば diff.colorMoved 設定を使用して、 移動した行に色を付ける場合、 空白(spaces)をどのように扱うかのモードを制御します。 有効なモードの詳細については git-diff(1)--color-moved-ws を参照してください。

SEE ALSO

GIT

Part of the git(1) suite