セットアップと設定
プロジェクトの取得と作成
基本的なスナップショット取得
ブランチとマージ
プロジェクトの共有と更新
検査と比較
パッチ適用
デバッグ
メール
外部システム
サーバー管理
ガイド
- gitattributes
- コマンドラインインターフェースの慣例
- 日常のGit
- よくある質問 (FAQ)
- 用語集
- フック
- gitignore
- gitmodules
- リビジョン
- サブモジュール
- チュートリアル
- ワークフロー
- すべてのガイド...
管理
プラミングコマンド
- 2.48.1 → 2.49.0 変更なし
-
2.48.0
2025-01-10
- 2.46.1 → 2.47.2 変更なし
-
2.46.0
2024-07-29
-
2.45.3
2024-11-26
- 2.45.1 → 2.45.2 変更なし
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.3 変更なし
-
2.44.0
2024-02-23
- 2.43.1 → 2.43.6 変更なし
-
2.43.0
2023-11-20
- 2.42.2 → 2.42.4 変更なし
-
2.42.1
2023-11-02
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 変更なし
-
2.41.0
2023-06-01
- 2.40.1 → 2.40.4 変更なし
-
2.40.0
2023-03-12
- 2.37.3 → 2.39.5 変更なし
-
2.37.2
2022-08-11
- 2.36.1 → 2.37.1 変更なし
-
2.36.0
2022-04-18
- 2.35.1 → 2.35.8 変更なし
-
2.35.0
2022-01-24
- 2.34.1 → 2.34.8 変更なし
-
2.34.0
2021-11-15
- 2.33.1 → 2.33.8 変更なし
-
2.33.0
2021-08-16
- 2.32.1 → 2.32.7 変更なし
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 変更なし
-
2.31.0
2021-03-15
- 2.30.1 → 2.30.9 変更なし
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 変更なし
-
2.29.0
2020-10-19
- 2.28.1 変更なし
-
2.28.0
2020-07-27
- 2.25.2 → 2.27.1 変更なし
-
2.25.1
2020-02-17
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 変更なし
-
2.24.0
2019-11-04
- 2.22.1 → 2.23.4 変更なし
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 変更なし
-
2.21.0
2019-02-24
- 2.20.1 → 2.20.5 変更なし
-
2.20.0
2018-12-09
- 2.19.1 → 2.19.6 変更なし
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 変更なし
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 変更なし
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
- 2.10.5 変更なし
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.7.6 変更なし
-
2.6.7
2017-05-05
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
- 2.1.4 → 2.2.3 変更なし
-
2.0.5
2014-12-17
説明
ツリーオブジェクト内のブロブの内容とモードを、ワーキングツリー内の対応する追跡ファイル、またはインデックス内の対応するパスと比較します。
オプション
-
-p
-
-u
-
--patch
-
パッチを生成します (-p でパッチテキストを生成するを参照)。
-
-s
-
--no-patch
-
diff機構からの出力をすべて抑制します。デフォルトでパッチを表示する
git show
のようなコマンドの出力を抑制したり、エイリアスでコマンドライン上の早い段階にある--patch
、--stat
などのオプションの効果を打ち消したりするのに役立ちます。 -
-U<n>
-
--unified=<n>
-
通常の3行ではなく、<n>行のコンテキストで差分を生成します。
--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
-
「histogram diff」アルゴリズムを使用して差分を生成します。
-
--anchored=<text>
-
「anchored diff」アルゴリズムを使用して差分を生成します。
このオプションは複数回指定できます。
ソースとデスティネーションの両方に存在する行が1回のみ存在し、<text>で始まる場合、このアルゴリズムはそれが出力で削除または追加として表示されるのを防ごうとします。内部的には「patience diff」アルゴリズムを使用します。
-
--diff-algorithm=(patience|minimal|histogram|myers)
-
差分アルゴリズムを選択します。バリアントは以下のとおりです。
例えば、
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
-
post-imageツリーで変更された各ファイルのファイル名のみを表示します。ファイル名は通常UTF-8でエンコードされています。詳細については、git-log[1]マニュアルページのエンコーディングに関する説明を参照してください。
-
--name-status
-
変更された各ファイルのファイル名とステータスのみを表示します。ステータス文字が何を意味するかについては、
--diff-filter
オプションの説明を参照してください。--name-only
と同様に、ファイル名は通常UTF-8でエンコードされています。 -
--submodule[=<format>]
-
サブモジュール内の差分をどのように表示するかを指定します。
--submodule=short
を指定すると、short
形式が使用されます。この形式は、範囲の開始と終了のコミット名のみを表示します。--submodule
または--submodule=log
が指定されている場合、log
形式が使用されます。この形式は、git-submodule[1]のsummary
と同様に、範囲内のコミットをリスト表示します。--submodule=diff
が指定されている場合、diff
形式が使用されます。この形式は、コミット範囲間のサブモジュール内容の変更をインラインで表示します。デフォルトはdiff.submodule
、または設定オプションが設定されていない場合はshort
形式です。 -
--color[=<when>]
-
色付きの差分を表示します。
--color
(つまり=<when>
なし)は--color=always
と同じです。<when>はalways
、never
、またはauto
のいずれかです。 -
--no-color
-
色付きの差分をオフにします。これは
--color=never
と同じです。 -
--color-moved[=<mode>]
-
移動したコード行は異なる色で表示されます。オプションが指定されていない場合、<mode>は
no
にデフォルト設定され、モードなしでオプションが指定された場合はzebra
にデフォルト設定されます。モードは以下のいずれかでなければなりません。-
no
-
移動した行はハイライトされません。
-
default
-
zebra
の同義語です。将来、より適切なモードに変更される可能性があります。 -
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
であり、以下のいずれかでなければなりません。最初のモードの名前にもかかわらず、有効になっている場合はすべてのモードで変更された部分をハイライトするために色が使用されることに注意してください。
-
--word-diff-regex=<regex>
-
非空白文字の連続を単語と見なす代わりに、<regex>を使用して単語を決定します。既に有効でない限り、
--word-diff
も暗示します。<regex>の重複しないすべてのマッチは単語と見なされます。これらのマッチ間のものはすべて空白文字と見なされ、差分を見つける目的では無視されます(!)。すべての非空白文字にマッチするように、正規表現に
|[^[:space:]]
を追加することをお勧めします。改行を含むマッチは、改行で黙って切り捨てられます(!)。例えば、
--word-diff-regex=.
は各文字を単語として扱い、それに応じて文字ごとに差分を表示します。正規表現はdiffドライバーまたは設定オプションを介して設定することもできます。gitattributes[5]またはgit-config[1]を参照してください。明示的に指定すると、diffドライバーまたは設定設定をすべて上書きします。Diffドライバーは設定設定を上書きします。
-
--color-words[=<regex>]
-
--word-diff=color
に、(正規表現が指定された場合は)--word-diff-regex=<regex>
を加えたものと同等です。 -
--no-renames
-
設定ファイルがデフォルトで有効にしている場合でも、名前変更検出をオフにします。
-
--[no-]rename-empty
-
空のブロブを名前変更元として使用するかどうか。
-
--check
-
変更が競合マーカーや空白エラーを導入する場合に警告します。空白エラーと見なされるものは
core.whitespace
設定によって制御されます。デフォルトでは、末尾の空白文字(空白のみで構成される行を含む)と、行の初期インデント内でタブ文字が直後に続くスペース文字は空白エラーと見なされます。問題が発見された場合はゼロ以外のステータスで終了します。--exit-code
とは互換性がありません。 -
--ws-error-highlight=<kind>
-
差分の
context
、old
、new
行の空白エラーをハイライト表示します。複数の値はコンマで区切られ、none
は以前の値をリセットし、default
はリストをnew
にリセットし、all
はold,new,context
の短縮形です。このオプションが指定されておらず、設定変数diff.wsErrorHighlight
が設定されていない場合、new
行の空白エラーのみがハイライト表示されます。空白エラーはcolor.diff.whitespace
で着色されます。 -
--full-index
-
パッチ形式の出力を生成する際に、「index」行に最初の数文字ではなく、pre-imageおよびpost-imageブロブオブジェクトのフルネームを表示します。
-
--binary
-
--full-index
に加えて、git-apply
で適用できるバイナリ差分を出力します。--patch
を暗示します。 -
--abbrev[=<n>]
-
diff-raw形式の出力およびdiff-treeヘッダー行で40バイトの完全な16進オブジェクト名を表示する代わりに、オブジェクトを一意に参照する最短のプレフィックスで、<n>桁以上の長さを持つものを表示します。diff-patch出力形式では、
--full-index
が優先されます。つまり、--full-index
が指定されている場合、--abbrev
に関わらず完全なブロブ名が表示されます。デフォルト以外の桁数は--abbrev=<n>
で指定できます。 -
-B[<n>][/<m>]
-
--break-rewrites[=[<n>][/<m>]]
-
完全な書き換え変更を削除と作成のペアに分割します。これには2つの目的があります。
これは、ファイルの完全な書き換えに相当する変更を、コンテキストとしてテキスト的に一致するごく少数の行と混ざった一連の削除と挿入としてではなく、古いものをすべて単一で削除し、その後に新しいものをすべて単一で挿入する方法に影響し、数値<m>は
-B
オプションのこの側面を制御します(デフォルトは60%)。-B/70%
は、Gitがそれを完全な書き換えと見なすために、元の30%未満が結果に残るべきであることを指定します(つまり、そうでなければ、結果のパッチはコンテキスト行と混ざった一連の削除と挿入になります)。-M
と共に使用すると、完全に書き換えられたファイルも名前変更の元として考慮され(通常、-M
は消失したファイルのみを名前変更の元として考慮します)、数値<n>は-B
オプションのこの側面を制御します(デフォルトは50%)。-B20%
は、ファイルのサイズの20%以上と比較して追加および削除を伴う変更が、別のファイルへの名前変更の可能な元として選択される資格があることを指定します。 -
-M[<n>]
-
--find-renames[=<n>]
-
名前変更を検出します。<n>が指定されている場合、それは類似度インデックス(つまり、ファイルのサイズと比較した追加/削除の量)のしきい値です。例えば、
-M90%
は、ファイルの90%以上が変更されていない場合、Gitが削除/追加のペアを名前変更と見なすべきであることを意味します。%
記号がない場合、数値は小数点が前にある分数として読み取られます。つまり、-M5
は0.5になり、したがって-M50%
と同じです。同様に、-M05
は-M5%
と同じです。厳密な名前変更のみに検出を制限するには、-M100%
を使用します。デフォルトの類似度インデックスは50%です。 -
-C[<n>]
-
--find-copies[=<n>]
-
名前変更だけでなく、コピーも検出します。
--find-copies-harder
も参照してください。<n>が指定されている場合、それは-M<n>
と同じ意味を持ちます。 -
--find-copies-harder
-
パフォーマンス上の理由から、デフォルトでは、
-C
オプションはコピー元のファイルが同じ変更セットで変更された場合にのみコピーを検出します。このフラグを使用すると、コマンドは変更されていないファイルをコピー元の候補として検査します。これは大規模なプロジェクトでは非常にコストのかかる操作なので、注意して使用してください。複数の-C
オプションを指定しても同じ効果があります。 -
-D
-
--irreversible-delete
-
削除に対するプレイメージを省略します。つまり、ヘッダーのみを表示し、プレイメージと
/dev/null
間の差分は表示しません。結果のパッチはpatch
やgit apply
で適用することを意図したものではなく、変更後のテキストのレビューに集中したい人向けです。さらに、この出力には、手動であってもそのようなパッチを逆方向に適用するのに十分な情報が明らかに不足しているため、このオプションの名前が付けられています。-B
と共に使用すると、削除/作成ペアの削除部分にあるプレイメージも省略されます。 -
-l<num>
-
-M
および-C
オプションには、名前変更/コピーのサブセットを安価に検出できる予備ステップが含まれており、その後に、残りのすべての未ペアのデスティネーションをすべての関連ソースと比較する網羅的なフォールバック部分が続きます。(名前変更の場合、残りの未ペアのソースのみが関連し、コピーの場合、すべての元のソースが関連します。)N個のソースとデスティネーションの場合、この網羅的なチェックはO(N^2)です。このオプションは、関係するソース/デスティネーションファイルの数が指定された数を超える場合、名前変更/コピー検出の網羅的な部分が実行されるのを防ぎます。デフォルトはdiff.renameLimit
です。0の値は無制限として扱われることに注意してください。 -
--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]
-
追加されたファイル (
A
)、コピーされたファイル (C
)、削除されたファイル (D
)、変更されたファイル (M
)、名前が変更されたファイル (R
)、タイプ(つまり、通常ファイル、シンボリックリンク、サブモジュールなど)が変更されたファイル (T
)、未マージのファイル (U
)、不明なファイル (X
)、またはペアリングが壊れたファイル (B
) のみを選択します。フィルター文字の任意の組み合わせ(なしも含む)を使用できます。*
(すべてまたはなし)が組み合わせに追加されると、比較で他の条件に一致するファイルがある場合、すべてのパスが選択されます。他の条件に一致するファイルがない場合、何も選択されません。また、これらの大文字は小文字にすることで除外できます。例:
--diff-filter=ad
は追加および削除されたパスを除外します。すべての差分がすべてのタイプを特徴づけられるわけではないことに注意してください。例えば、それらのタイプの検出が無効になっている場合、コピーおよび名前変更されたエントリは表示されません。
-
-S<string>
-
ファイル内で、指定された<string>の出現回数に変化(追加/削除など)をもたらす差分を探します。スクリプター向けです。
これは、正確なコードブロック(構造体など)を探していて、そのブロックが最初に作成されてからの履歴を知りたい場合に便利です。この機能は反復的に使用し、プレイメージにある関心のあるブロックを
-S
に繰り返し入力し、そのブロックの最初のバージョンが見つかるまで続けます。バイナリファイルも検索されます。
-
-G<regex>
-
パッチテキストに<regex>に一致する追加/削除された行が含まれる差分を探します。
-S<regex>
--pickaxe-regex
と-G<regex>
の違いを説明するために、同じファイルに以下の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番目のパターンに一致する(ただし最初のパターンには一致しない)パス名を持つファイルが出力される、といった具合です。どのパターンにも一致しないパス名を持つファイルは、ファイルの最後に暗黙的な「すべてに一致するパターン」があるかのように、最後に出力されます。複数のパス名が同じランクを持つ場合(同じパターンに一致するが、それ以前のパターンには一致しない場合)、それらの相互の出力順序は通常の順序になります。
<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 hunk間のコンテキストを、指定された<number>行まで表示し、互いに近いhunkを融合させます。設定オプションが設定されていない場合、
diff.interHunkContext
または0がデフォルトとなります。 -
-W
-
--function-context
-
各変更に対して、関数全体をコンテキスト行として表示します。関数名は、
git diff
がパッチhunkヘッダーを生成する方法と同じ方法で決定されます(gitattributes[5]の「カスタムhunkヘッダーの定義」を参照)。 -
--exit-code
-
プログラムを
diff
(1)に似た終了コードで終了させます。つまり、差分があった場合は1で終了し、差分がなかった場合は0で終了します。 -
--quiet
-
プログラムのすべての出力を無効にします。
--exit-code
を暗黙的に指定します。終了コードが信頼できない外部diffヘルパーの実行を無効にします。これは、それぞれの設定オプションdiff.trustExitCode
またはdiff.
<driver>.trustExitCode
、または環境変数GIT_EXTERNAL_DIFF_TRUST_EXIT_CODE
がfalseの場合です。 -
--ext-diff
-
外部diffヘルパーの実行を許可します。gitattributes[5]で外部diffドライバーを設定した場合、git-log[1]や関連コマンドでこのオプションを使用する必要があります。
-
--no-ext-diff
-
外部diffドライバーを禁止します。
-
--textconv
-
--no-textconv
-
バイナリファイルの比較時に外部テキスト変換フィルターの実行を許可(または禁止)します。詳細はgitattributes[5]を参照してください。textconvフィルターは通常一方向の変換であるため、生成されるdiffは人間が読むのに適していますが、適用することはできません。このため、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/"の代わりに、指定されたソース<prefix>を表示します。
-
--dst-prefix=<prefix>
-
"b/"の代わりに、指定された宛先<prefix>を表示します。
-
--no-prefix
-
ソースまたは宛先のプレフィックスを表示しません。
-
--default-prefix
-
デフォルトのソースおよび宛先プレフィックス("a/"と"b/")を使用します。これは、
diff.noprefix
、diff.srcPrefix
、diff.dstPrefix
、およびdiff.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]も参照してください。
生出力フォーマット
git-diff-index
、git-diff-tree
、git-diff-files
、およびgit diff --raw
からの生出力フォーマットは非常に似ています。
これらのコマンドはすべて2つのもののセットを比較します。比較されるものは異なります。
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
つまり、左から右へ
-
コロン。
-
"src"のモード。作成または未マージの場合は000000。
-
スペース。
-
"dst"のモード。削除または未マージの場合は000000。
-
スペース。
-
"src"のsha1。作成または未マージの場合は0{40}。
-
スペース。
-
"dst"のsha1。削除、未マージ、または「ワークツリーがインデックスと同期していない」場合は0{40}。
-
スペース。
-
ステータス。その後にオプションで「スコア」番号が続きます。
-
タブ、または
-z
オプション使用時はNUL。 -
"src"のパス。
-
タブ、または
-z
オプション使用時はNUL。CまたはRの場合のみ存在します。 -
"dst"のパス。CまたはRの場合のみ存在します。
-
レコードを終端するためのLF、または
-z
オプション使用時は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
は、マージコミットに対してもdiff出力を生成するために-c
または--cc
オプションを取ることができます。出力は上記のフォーマットと以下の点で異なります。
-
各親に対してコロンがあります。
-
より多くの"src"モードと"src" sha1があります。
-
ステータスは、各親のステータス文字が連結されたものです。
-
オプションの「スコア」番号はありません。
-
ファイルのタブ区切りパス名
-c
および--cc
の場合、ファイルの履歴のどの側で名前が変更されていても、宛先または最終パスのみが表示されます。--combined-all-paths
を使用すると、各親のパス名が表示され、その後にマージコミット内のパス名が続きます。
--combined-all-paths
なしの-c
および--cc
の例
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c ::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh ::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
--combined-all-paths
が-c
または--cc
のいずれかに追加された場合の例
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c ::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh ::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
結合diffは、すべての親から変更されたファイルのみをリストすることに注意してください。
-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フォーマットとはわずかに異なります。
-
それに先立って、次のような「git diff」ヘッダーがあります。
diff --git a/file1 b/file2
a/
とb/
のファイル名は、名前変更/コピーが関与しない限り同じです。特に、作成または削除の場合でも、/dev/null
はa/
またはb/
のファイル名の代わりには使用されません。名前変更/コピーが関与する場合、
file1
とfile2
はそれぞれ、名前変更/コピーのソースファイルの名前と、名前変更/コピーによって生成されるファイルの名前を示します。 -
その後に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%は古いファイルから新しいファイルに移動した行がないことを意味します。
インデックス行には、変更前と変更後のblobオブジェクト名が含まれます。ファイルモードが変更されない場合、<mode>が含まれます。それ以外の場合、別の行で古いモードと新しいモードが示されます。
-
「通常でない」文字を含むパス名は、設定変数
core.quotePath
(git-config[1]を参照)で説明されているように引用符で囲まれて出力されます。 -
出力中のすべての
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
-
Hunkヘッダーは、そのhunkが適用される関数名を記載しています。これを特定の言語に合わせて調整する方法の詳細は、gitattributes[5]の「カスタムhunkヘッダーの定義」を参照してください。
結合diffフォーマット
どのdiff生成コマンドでも、マージ表示時に結合diffを生成するために-c
または--cc
オプションを使用できます。これは、git-diff[1]またはgit-show[1]でマージを表示する際のデフォルトフォーマットです。また、特定のフォーマットでdiffの生成を強制するために、これらのコマンドのいずれかに適切な--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);
-
それに先立って、次のような「git diff」ヘッダーがあります(
-c
オプションが使用された場合)。diff --combined file
または、次のようになります(
--cc
オプションが使用された場合)。diff --cc file
-
その後に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フォーマットでは使用されません。 -
その後に2行のfrom-file/to-fileヘッダーが続きます。
--- a/file +++ b/file
従来のunified diffフォーマットの2行ヘッダーと同様に、作成または削除されたファイルを示すために
/dev/null
が使用されます。しかし、--combined-all-pathsオプションが提供された場合、2行のfrom-file/to-fileの代わりに、マージコミットの親の数Nに応じたN+1行のfrom-file/to-fileヘッダーが得られます。
--- a/file --- a/file --- a/file +++ b/file
この拡張フォーマットは、名前変更またはコピーの検出がアクティブな場合に、異なる親でのファイルの元の名前を確認できるため便利です。
-
チャンクヘッダーのフォーマットは、誤って
patch -p1
に渡されるのを防ぐために変更されています。結合diffフォーマットはマージコミットの変更をレビューするために作成されたものであり、適用されることを意図していません。この変更は、拡張indexヘッダーの変更と似ています。@@@ <from-file-range> <from-file-range> <to-file-range> @@@
結合diffフォーマットのチャンクヘッダーには、(親の数+1)個の
@
文字があります。
従来のunified diffフォーマットは、ファイルAとBを単一の列で表示し、-
(マイナス — Aには存在するがBからは削除)、+
(プラス — Aには存在しないがBに追加)、または" "
(スペース — 変更なし)のプレフィックスを持ちますが、このフォーマットは2つ以上のファイルfile1, file2,…を1つのファイルXと比較し、Xが各fileNとどのように異なるかを示します。各fileNの列が出力行の先頭に付加され、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」)です)。
その他のdiffフォーマット
--summary
オプションは、新しく追加、削除、名前変更、コピーされたファイルを記述します。--stat
オプションは、diffstat
(1)グラフを出力に追加します。これらのオプションは、-p
などの他のオプションと組み合わせることができ、人間が読むことを目的としています。
名前変更またはコピーを伴う変更を表示する場合、--stat
の出力は、パス名の共通のプレフィックスとサフィックスを結合することでパス名をコンパクトにフォーマットします。たとえば、arch/i386/Makefile
をarch/x86/Makefile
に移動しつつ4行を変更する変更は次のように表示されます。
arch/{i386 => x86}/Makefile | 4 +--
--numstat
オプションはdiffstat(1)の情報を提供しますが、機械による消費を容易にするように設計されています。--numstat
出力のエントリは次のようになります。
1 2 README 3 1 arch/{i386 => x86}/Makefile
つまり、左から右へ
-
追加された行数;
-
タブ;
-
削除された行数;
-
タブ;
-
パス名(名前変更/コピー情報を含む場合があります);
-
改行。
-z
出力オプションが有効な場合、出力は次のようにフォーマットされます。
1 2 README NUL 3 1 NUL arch/i386/Makefile NUL arch/x86/Makefile NUL
つまり
-
追加された行数;
-
タブ;
-
削除された行数;
-
タブ;
-
NUL(名前変更/コピーされた場合にのみ存在します);
-
プレイメージのパス名;
-
NUL(名前変更/コピーされた場合にのみ存在します);
-
ポストイメージのパス名(名前変更/コピーされた場合にのみ存在します);
-
NUL。
名前変更されたケースでプレイメージパスの前に余分なNUL
があるのは、出力を読み取るスクリプトが、先読みせずに現在読み取っているレコードが単一パスレコードか名前変更/コピーレコードかを判別できるようにするためです。追加および削除された行を読み取った後、NUL
まで読み取るとパス名が得られますが、それがNUL
の場合、レコードは2つのパスを示します。
動作モード
インデックスファイルを完全に信頼するか(--cached
フラグを使用)、またはstatの状態と一致しないファイルを「暫定的に変更された」ものとしてdiffロジックに表示させるかを選択できます。これらの操作はどちらも非常に有用です。
キャッシュモード
--cached
が指定されている場合、次のことを尋ねることができます。
show me the differences between HEAD and the current index contents (the ones I'd write using 'git write-tree')
たとえば、ワーキングディレクトリで作業し、インデックス内のいくつかのファイルを更新し、コミットの準備ができたとします。新しいツリーオブジェクトを書き込んでそのように比較することなく、正確に何をコミットしようとしているのかを確認したい場合、次のようにします。
git diff-index --cached HEAD
例:commit.c
をgit-commit.c
に名前変更し、インデックスファイルにそれを反映させるためにupdate-index
を実行したとします。インデックスファイルがワーキングディレクトリと一致しているため、git diff-files
は何も表示しません。しかし、git diff-indexを実行すると表示されます。
torvalds@ppc970:~/git> git diff-index --cached HEAD :100644 000000 4161aecc6700a2eb579e842af0b7f22b98443f74 0000000000000000000000000000000000000000 D commit.c :000000 100644 0000000000000000000000000000000000000000 4161aecc6700a2eb579e842af0b7f22b98443f74 A git-commit.c
上記が名前変更であることが容易にわかります。
実際、git diff-index --cached
は、常にgit write-treeを実行してそれを比較することと完全に同等であるべきです。ただし、現在の状況を確認したいだけの場合には、こちらの方がはるかに便利です。
したがって、git diff-index --cached
を実行することは、「すでにコミットするようマークしたものは何か、そして以前のツリーとの違いは何か」と自問している場合に非常に役立ちます。
非キャッシュモード
「非キャッシュ」モードは異なるアプローチを取り、git write-tree + git diff-treeではエミュレートできないため、2つのうちでより有用である可能性があります。したがって、これがデフォルトモードです。非キャッシュバージョンは次の質問をします。
show me the differences between HEAD and the currently checked out tree - index contents _and_ files that aren't up to date
これは、明らかに非常に有用な質問でもあります。なぜなら、何をコミットできるかを示してくれるからです。ここでも、出力はgit diff-tree -rの出力とそっくりですが、少しひねりがあります。
ひねりとは、もし一部のファイルがインデックスと一致しない場合、それに対するバッキングストアが存在しないため、魔法の「すべてゼロ」のsha1を使用してそれを表示するという点です。たとえば、kernel/sched.c
を編集したが、まだgit update-indexを実行していないとします。この新しい状態に関連付けられた「オブジェクト」がないため、次のように表示されます。
torvalds@ppc970:~/v2.6/linux> git diff-index --abbrev HEAD :100644 100644 7476bb5ba 000000000 M kernel/sched.c
つまり、ツリーが変更され、kernel/sched.c
が最新ではなく、新しい内容を含んでいる可能性があることを示しています。すべてゼロのsha1は、実際のdiffを取得するには、オブジェクト間のdiffを実行するのではなく、ワーキングディレクトリ内のオブジェクトを直接確認する必要があることを意味します。
注
|
この種の他のコマンドと同様に、git diff-indexは実際にはファイルの内容を一切見ません。そのため、もしかしたらkernel/sched.c は実際には変更されておらず、単に触っただけかもしれません。どちらの場合でも、インデックスを同期させるためにgit update-indexを実行する必要があるという注意です。 |
注
|
「更新済み」と「ワーキングディレクトリでまだダーティ」なファイルが混在して表示されることがあります。「更新済み」のファイルは有効なsha1を表示し、「インデックスと同期していない」ファイルは常に特別なすべてゼロのsha1を持つため、どのファイルがどの状態にあるかを常に判別できます。 |
GIT
git[1]スイートの一部