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

名前

git-show - さまざまな種類のオブジェクトを表示する

概要

git show [<options>] [<object>…​]

説明

1つ以上のオブジェクト(ブロブ、ツリー、タグ、コミット)を表示します。

コミットの場合、ログメッセージとテキスト形式の差分を表示します。また、 _git diff-tree --cc_ によって生成される特別な形式でマージコミットを表示します。

タグの場合、タグメッセージと参照されるオブジェクトを表示します。

ツリーの場合、名前を表示します( _git ls-tree --name-only_ と同等)。

プレーンブロブの場合、プレーンコンテンツを表示します。

_git log_ コマンドが理解できるいくつかのオプションを使用して、コミットによって導入される変更の表示方法を制御できます。

このマニュアルページでは、最も頻繁に使用されるオプションのみについて説明します。

オプション

<オブジェクト>…​

表示するオブジェクトの名前(デフォルトは _HEAD_ )。オブジェクト名を指定する方法のより完全なリストについては、gitrevisions[7]の「リビジョンの指定」セクションを参照してください。

--pretty[=<フォーマット>]
--format=<フォーマット>

コミットログの内容を指定された形式で整形して出力します。ここで、 _<フォーマット>_ は _oneline_ 、 _short_ 、 _medium_ 、 _full_ 、 _fuller_ 、 _reference_ 、 _email_ 、 _raw_ 、 _format:<文字列>_ 、 _tformat:<文字列>_ のいずれかになります。 _<フォーマット>_ が上記のいずれでもなく、 _%プレースホルダー_ が含まれている場合、 _--pretty=tformat:<フォーマット>_ が指定されたかのように動作します。

各フォーマットの詳細については、「整形フォーマット」セクションを参照してください。 _=<フォーマット>_ 部分が省略された場合、デフォルトは _medium_ になります。

注:リポジトリ設定でデフォルトの整形フォーマットを指定できます(git-config[1]を参照)。

--abbrev-commit

40バイトの16進数のコミットオブジェクト名全体を表示する代わりに、オブジェクトを一意に識別するプレフィックスを表示します。 "--abbrev=<n>" オプション(差分出力も表示される場合は変更します)を使用して、プレフィックスの最小長を指定できます。

これは、80列の端末を使用している人にとって "--pretty=oneline" をはるかに読みやすくするはずです。

--no-abbrev-commit

40バイトの16進数のコミットオブジェクト名全体を表示します。これは、明示的な `--abbrev-commit`、または "--oneline" などの他のオプションによって暗黙的に示される `--abbrev-commit` を無効にします。また、 `log.abbrevCommit` 変数をオーバーライドします。

--oneline

これは、 "--pretty=oneline --abbrev-commit" を一緒に使用した省略形です。

--encoding=<エンコーディング>

コミットオブジェクトは、エンコーディングヘッダーにログメッセージに使用された文字エンコーディングを記録します。このオプションを使用すると、コマンドにコミットログメッセージをユーザーが preferred するエンコーディングで再コードするように指示できます。低レベルコマンド以外の場合、これはデフォルトでUTF-8になります。オブジェクトが `X` でエンコードされていると主張し、 `X` で出力している場合、オブジェクトを逐語的に出力することに注意してください。これは、元のコミットの無効なシーケンスが出力にコピーされる可能性があることを意味します。同様に、iconv(3) がコミットの変換に失敗した場合、元のオブジェクトを警告なしで逐語的に出力します。

--expand-tabs=<n>
--expand-tabs
--no-expand-tabs

出力に表示する前に、ログメッセージでタブ展開(各タブを _<n>_ の倍数である次の表示列まで埋めるのに十分なスペースに置き換える)を実行します。 `--expand-tabs` は `--expand-tabs=8` の省略形であり、 `--no-expand-tabs` はタブ展開を無効にする `--expand-tabs=0` の省略形です。

デフォルトでは、ログメッセージを4スペースでインデントする整形フォーマット(つまり、デフォルトの _medium_ 、 _full_ 、および _fuller_ )でタブが展開されます。

--notes[=<参照>]

コミットログメッセージを表示するときに、コミットに注釈を付けるメモ(git-notes[1]を参照)を表示します。コマンドラインで `--pretty`、 `--format`、または `--oneline` オプションが指定されていない場合、これは `git log`、 `git show`、および `git whatchanged` コマンドのデフォルトです。

デフォルトでは、表示されるメモは、 `core.notesRef` および `notes.displayRef` 変数(または対応する環境オーバーライド)にリストされているメモ参照からのものです。詳細については、git-config[1] を参照してください。

オプションの _<参照>_ 引数を使用すると、参照を使用して表示するメモを検索します。参照は、 `refs/notes/` で始まる場合は完全な参照名を指定できます。 `notes/` で始まる場合は、 `refs/`、それ以外の場合は `refs/notes/` がプレフィックスとして付けられ、参照の完全な名前が形成されます。

複数の --notes オプションを組み合わせて、表示されるメモを制御できます。例: "--notes=foo" は "refs/notes/foo" からのメモのみを表示します。 "--notes=foo --notes" は "refs/notes/foo" とデフォルトのメモ参照の両方からのメモを表示します。

--no-notes

メモを表示しません。これは、上記の `--notes` オプションを無効にし、メモが表示されるメモ参照のリストをリセットすることで実現します。オプションはコマンドラインで指定された順序で解析されるため、たとえば "--notes --notes=foo --no-notes --notes=bar" は "refs/notes/bar" からのメモのみを表示します。

--show-notes-by-default

特定のメモを表示するためのオプションが指定されていない限り、デフォルトのメモを表示します.

--show-notes[=<参照>]
--[no-]standard-notes

これらのオプションは推奨されていません。代わりに上記の --notes/--no-notes オプションを使用してください。

--show-signature

署名を `gpg --verify` に渡して署名付きコミットオブジェクトの有効性を確認し、出力を表示します。

整形フォーマット

コミットがマージであり、整形フォーマットが _oneline_ 、 _email_ 、または _raw_ でない場合、 _Author:_ 行の前に追加の行が挿入されます。この行は "Merge: " で始まり、祖先コミットのハッシュがスペースで区切られて出力されます。履歴のビューを制限している場合、リストされているコミットは必ずしも **直接の** 親コミットのリストではないことに注意してください。たとえば、特定のディレクトリまたはファイルに関連する変更のみに関心がある場合などです。

いくつかの組み込みフォーマットがあり、pretty.<name> 設定オプションを別のフォーマット名または以下で説明する _format:_ 文字列に設定することで、追加のフォーマットを定義できます(git-config[1]を参照)。組み込みフォーマットの詳細は次のとおりです

  • oneline

    <hash> <title-line>

    これは可能な限りコンパクトになるように設計されています。

  • short

    commit <hash>
    Author: <author>
    <title-line>
  • medium

    commit <hash>
    Author: <author>
    Date:   <author-date>
    <title-line>
    <full-commit-message>
  • full

    commit <hash>
    Author: <author>
    Commit: <committer>
    <title-line>
    <full-commit-message>
  • fuller

    commit <hash>
    Author:     <author>
    AuthorDate: <author-date>
    Commit:     <committer>
    CommitDate: <committer-date>
    <title-line>
    <full-commit-message>
  • reference

    <abbrev-hash> (<title-line>, <short-author-date>)

    このフォーマットは、コミットメッセージで別のコミットを参照するために使用され、 `--pretty='format:%C(auto)%h (%s, %ad)'` と同じです。デフォルトでは、別の `--date` オプションが明示的に指定されていない限り、日付は `--date=short` でフォーマットされます。フォーマットプレースホルダーを含む `format:` と同様に、その出力は `--decorate` や `--walk-reflogs` などの他のオプションの影響を受けません。

  • メール

    From <hash> <date>
    From: <author>
    Date: <author-date>
    Subject: [PATCH] <title-line>
    <full-commit-message>
  • mboxrd

    メールと似ていますが、コミットメッセージの中で"From "(その前に0個以上の">"が付く場合があります)で始まる行は、新しいコミットの開始と混同されないように">"で引用符で囲まれます。

  • raw

    rawフォーマットは、コミットオブジェクトに格納されているコミット全体をそのまま表示します。特に、ハッシュは--abbrevまたは--no-abbrevが使用されているかどうかに関係なく完全な形で表示され、parents情報はグラフトや履歴の簡略化を考慮せずに真の親コミットを表示します。このフォーマットはコミットの表示方法に影響しますが、例えばgit log --rawのように差分の表示方法には影響しないことに注意してください。raw差分フォーマットで完全なオブジェクト名を取得するには、--no-abbrevを使用します。

  • format:<format-string>

    format:<format-string>フォーマットを使用すると、表示する情報を指定できます。printfフォーマットと少し似ていますが、\nではなく%nで改行を取得するという顕著な例外があります。

    例えば、format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" は次のように表示されます

    The author of fe6e0ee was Junio C Hamano, 23 hours ago
    The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<

    プレースホルダーは以下のとおりです

    • 単一の文字に展開されるプレースホルダー

      %n

      改行

      %%

      生の %

      %x00

      %x の後に16進数の2桁が続くと、その16進数の値を持つバイトに置き換えられます(本書の残りの部分では、これを「リテラル書式設定コード」と呼びます)。

    • 後続のプレースホルダーの書式設定に影響するプレースホルダー

      %Cred

      色を赤に切り替える

      %Cgreen

      色を緑に切り替える

      %Cblue

      色を青に切り替える

      %Creset

      色をリセットする

      %C(…​)

      git-config[1]の「設定ファイル」セクションの値で説明されているように、色の指定です。デフォルトでは、ログ出力で有効になっている場合(color.diffcolor.ui、または--colorによって、ターミナルに出力される場合は前者のauto設定を考慮します)にのみ色が表示されます。 %C(auto,...) は、デフォルトの過去の同義語として受け入れられます(例:%C(auto,red))。 %C(always,...) を指定すると、色が有効になっていない場合でも色が表示されます(ただし、--color=always を使用して、この形式や git が色付けする可能性のある他のものを含む、出力全体の色を有効にすることを検討してください)。 auto単独(つまり%C(auto))は、色が再び切り替えられるまで、次のプレースホルダーで自動色付けをオンにします。

      %m

      左(<)、右(>)、または境界(-)マーク

      %w([<w>[,<i1>[,<i2>]]])

      git-shortlog[1]の-wオプションのように、行の折り返しを切り替えます。

      %<( <N> [,trunc|ltrunc|mtrunc])

      次のプレースホルダーが少なくともNカラム幅になるようにし、必要に応じて右側にスペースを埋め込みます。出力の長さがNカラムより長い場合は、オプションで左(ltrunc)..ft、中央(mtrunc)mi..le、または末尾(trunc)rig..で省略記号..を使用して切り捨てます。注1:切り捨てはN >= 2でのみ正しく機能します。注2:NとM(下記参照)の値の前後のスペースはオプションです。注3:絵文字やその他のワイド文字は2つの表示カラムを使用するため、カラムの境界を越える場合があります。注4:分解された文字の結合記号は、パディングの境界で誤配置される可能性があります。

      %<|( <M> )

      次のプレースホルダーが少なくともM番目の表示カラムになるようにし、必要に応じて右側にスペースを埋め込みます。端末ウィンドウの右端から測定したカラム位置には、負のM値を使用します。

      %>( <N> ), %>|( <M> )

      それぞれ%<( <N> )%<|( <M> )に似ていますが、左側にスペースを埋め込みます

      %>>( <N> ), %>>|( <M> )

      それぞれ%>( <N> )%>|( <M> )に似ていますが、次のプレースホルダーが指定されたスペースよりも多くのスペースを必要とし、左側にスペースがある場合は、それらのスペースを使用します

      %><( <N> ), %><|( <M> )

      それぞれ%<( <N> )%<|( <M> )に似ていますが、両側にスペースを埋め込みます(つまり、テキストは中央揃えになります)

    • コミットから抽出された情報に展開されるプレースホルダー

      %H

      コミットハッシュ

      %h

      省略されたコミットハッシュ

      %T

      ツリーハッシュ

      %t

      省略されたツリーハッシュ

      %P

      親ハッシュ

      %p

      省略された親ハッシュ

      %an

      作者名

      %aN

      作者名(.mailmapを考慮します。 git-shortlog[1]またはgit-blame[1]を参照)

      %ae

      作者のメールアドレス

      %aE

      作者のメールアドレス(.mailmapを考慮します。 git-shortlog[1]またはgit-blame[1]を参照)

      %al

      作者のメールアドレスのローカルパート(@記号より前の部分)

      %aL

      作者のローカルパート(%alを参照)(.mailmapを考慮します。 git-shortlog[1]またはgit-blame[1]を参照)

      %ad

      作者の日付(フォーマットは--date =オプションに従います)

      %aD

      作者の日付、RFC2822スタイル

      %ar

      作者の日付、相対

      %at

      作者の日付、UNIXタイムスタンプ

      %ai

      作者の日付、ISO 8601のようなフォーマット

      %aI

      作者の日付、厳密なISO 8601フォーマット

      %as

      作者の日付、短いフォーマット(YYYY-MM-DD

      %ah

      作者の日付、人間が読めるスタイル(git-rev-list[1]--date=humanオプションのように)

      %cn

      コミッター名

      %cN

      コミッター名(.mailmapを考慮します。 git-shortlog[1]またはgit-blame[1]を参照)

      %ce

      コミッターのメールアドレス

      %cE

      コミッターのメールアドレス(.mailmapを考慮します。 git-shortlog[1]またはgit-blame[1]を参照)

      %cl

      コミッターのメールアドレスのローカルパート(* @ *記号より前の部分)

      %cL

      コミッターのローカルパート(*%cl *を参照)(。mailmapを考慮します。 git-shortlog [1]またはgit-blame [1]を参照) )

      %cd

      コミッターの日付(フォーマットは--date =オプションに従います)

      %cD

      コミッターの日付、RFC2822スタイル

      %cr

      コミッターの日付、相対

      %ct

      コミッターの日付、UNIXタイムスタンプ

      %ci

      コミッターの日付、ISO 8601のようなフォーマット

      %cI

      コミッターの日付、厳密なISO 8601フォーマット

      %cs

      コミッターの日付、短いフォーマット(YYYY-MM-DD

      %ch

      コミッターの日付、人間が読めるスタイル(git-rev-list[1]--date=humanオプションのように)

      %d

      git-log [1]の--decorateオプションのような参照名

      %D

      「(」、「)」で囲まれていない参照名。

      %(decorate[:<options>])

      カスタムデコレーション付きの参照名。 decorate文字列の後にコロンと、コンマ区切りのオプションが0個以上続く場合があります。オプション値には、リテラル書式設定コードを含めることができます。オプション構文での役割のため、コンマ(%x2C)と閉じかっこ(%x29)にはこれらを使用する必要があります。

      • prefix=<value>:参照名のリストの前に表示されます。デフォルトは「 (」です。

      • suffix=<value>:参照名のリストの後に表示されます。デフォルトは「)」です。

      • *separator=<value> *:参照名の間に表示されます。デフォルトは「」です。

      • *pointer=<value> *:HEADとそれが指すブランチ(存在する場合)の間に表示されます。デフォルトは「 ->」です。

      • *tag=<value> *:タグ名の前に表示されます。デフォルトは「tag:」です。

    たとえば、ラッピングやタグ注釈のないデコレーションを作成し、区切り文字としてスペースを使用するには、次のようにします。

    + %(decorate:prefix=,suffix=,tag=,separator= )

    %(describe[:<options>])

    git-describe[1]のような人間が読める名前。記述できないコミットの場合は空の文字列。 describe文字列の後にコロンと、コンマ区切りのオプションが0個以上続く場合があります。タグが同時に追加または削除されると、説明に一貫性がなくなる可能性があります。

    • tags[=<bool-value>]:注釈付きタグのみを考慮する代わりに、軽量タグも考慮します。

    • abbrev=<number>:省略されたオブジェクト名のデフォルトの16進数の桁数(リポジトリ内のオブジェクトの数に応じて異なり、デフォルトは7)を使用する代わりに、<number>桁、または一意のオブジェクト名を形成するために必要な数の桁を使用します。

    • match=<pattern>: "refs/tags/"プレフィックスを除く、指定されたglob(7)パターンに一致するタグのみを考慮します。

    • exclude=<pattern>: "refs/tags/"プレフィックスを除く、指定されたglob(7)パターンに一致するタグは考慮しません。

    %S

    コミットに到達したコマンドラインで指定された参照名(git log --sourceのように)、git logでのみ機能します

    %e

    エンコーディング

    %s

    件名

    %f

    ファイル名に適した、サニタイズされた件名行

    %b

    本文

    %B

    生の本文(ラップされていない件名と本文)

    %N

    コミットノート

    %GG

    署名付きコミットのGPGからの生の検証メッセージ

    %G?

    有効な(有効な)署名には「G」、無効な署名には「B」、有効性が不明な有効な署名には「U」、期限切れの有効な署名には「X」、期限切れの鍵によって作成された有効な署名には「Y」、失効した鍵によって作成された有効な署名には「R」、署名を確認できない場合(例:鍵がない場合)は「E」、署名がない場合は「N」を表示します

    %GS

    署名付きコミットの署名者の名前を表示する

    %GK

    署名付きコミットの署名に使用された鍵を表示する

    %GF

    署名済みコミットの署名に使用された鍵のフィンガープリントを表示します。

    %GP

    署名済みコミットの署名に使用されたサブキーを持つプライマリキーのフィンガープリントを表示します。

    %GT

    署名済みコミットの署名に使用された鍵の信頼レベルを表示します。

    %gD

    reflog セレクタ、例:refs/stash@{1} または refs/stash@{2 minutes ago}。フォーマットは -g オプションで説明されているルールに従います。 @ より前の部分は、コマンドラインで指定されたrefnameです(そのため、git log -g refs/heads/masterrefs/heads/master@{0} を生成します)。

    %gd

    短縮された reflog セレクタ。 %gD と同じですが、refname 部分は人間が読みやすいように短縮されています(そのため、refs/heads/mastermaster になります)。

    %gn

    reflog アイデンティティ名

    %gN

    reflog アイデンティティ名(.mailmap を考慮します。 git-shortlog[1] または git-blame[1] を参照してください)

    %ge

    reflog アイデンティティメール

    %gE

    reflog アイデンティティメール(.mailmap を考慮します。 git-shortlog[1] または git-blame[1] を参照してください)

    %gs

    reflog 件名

    %(trailers[:<options>])

    git-interpret-trailers[1]によって解釈された本文のトレーラーを表示します。 trailers 文字列の後にコロンと、ゼロ個以上のカンマ区切りのオプションが続く場合があります。オプションが複数回指定された場合、最後のものが有効になります。

    • key=<key>: 指定された <key> を持つトレーラーのみを表示します。一致は大文字と小文字を区別せず、末尾のコロンは省略可能です。オプションが複数回指定された場合、いずれかのキーに一致するトレーラー行が表示されます。このオプションは自動的に only オプションを有効にして、トレーラーブロック内のトレーラー以外の行が非表示になります。それが望ましくない場合は、only=false で無効にすることができます。例:%(trailers:key=Reviewed-by) は、キー Reviewed-by を持つトレーラー行を表示します。

    • only[=<bool>]: トレーラーブロックからのトレーラー以外の行を含めるかどうかを選択します。

    • separator=<sep>: トレーラー行の間に挿入される区切り文字を指定します。デフォルトは改行文字です。文字列 <sep> には、上記のリテラルフォーマットコードを含めることができます。区切り文字としてカンマを使用するには、次のオプションとして解析されるため、%x2C を使用する必要があります。例:%(trailers:key=Ticket,separator=%x2C ) は、キーが "Ticket" であるすべてのトレーラー行をカンマとスペースで区切って表示します。

    • unfold[=<bool>]: interpret-trailer の --unfold オプションが指定されたかのように動作させます。例:%(trailers:only,unfold=true) は、すべてのトレーラー行を展開して表示します。

    • keyonly[=<bool>]: トレーラーのキー部分のみを表示します。

    • valueonly[=<bool>]: トレーラーの値部分のみを表示します。

    • key_value_separator=<sep>: 各トレーラーのキーと値の間に挿入される区切り文字を指定します。デフォルトは ": " です。それ以外の場合は、上記の *separator=<sep>* と同じセマンティクスを共有します。

注記
一部のプレースホルダーは、リビジョントラバーサルエンジンに指定された他のオプションに依存する場合があります。たとえば、%g* reflog オプションは、reflog エントリをトラバースしていない限り(例:git log -g)、空の文字列を挿入します。 %d および %D プレースホルダーは、コマンドラインで --decorate がまだ指定されていない場合、「short」装飾フォーマットを使用します。

ブール値オプションは、オプションの値 [=<bool-value>] を受け入れます。 truefalseonoff などの値はすべて受け入れられます。 git-config[1] の「EXAMPLES」の「boolean」サブセクションを参照してください。ブール値オプションが値なしで指定された場合、有効になります。

プレースホルダーの % の後に +(プラス記号)を追加すると、プレースホルダーが空でない文字列に展開された場合にのみ、展開の直前に改行が挿入されます。

プレースホルダーの % の後に -(マイナス記号)を追加すると、プレースホルダーが空の文字列に展開された場合にのみ、展開の直前にある連続する改行がすべて削除されます。

プレースホルダーの *%* の後に `` (スペース)を追加すると、プレースホルダーが空でない文字列に展開された場合にのみ、展開の直前にスペースが挿入されます。

  • tformat

    tformat: フォーマットは *format:* とまったく同じように機能しますが、「separator」セマンティクスではなく「terminator」セマンティクスを提供します。つまり、各コミットには、エントリ間に区切り文字が配置されるのではなく、メッセージターミネータ文字(通常は改行)が追加されます。これは、「oneline」フォーマットと同様に、単一行フォーマットの最後のエントリが改行で正しく終了することを意味します。例えば

    $ git log -2 --pretty=format:%h 4da45bef \
      | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/'
    4da45be
    7134973 -- NO NEWLINE
    
    $ git log -2 --pretty=tformat:%h 4da45bef \
      | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/'
    4da45be
    7134973

    さらに、% が含まれている認識されない文字列は、前に tformat: があるかのように解釈されます。たとえば、これら2つは同等です

    $ git log -2 --pretty=tformat:%h 4da45bef
    $ git log -2 --pretty=%h 4da45bef

DIFF フォーマット

以下のオプションを使用して、git show が diff 出力を生成する方法を変更できます。

-p
-u
--patch

パッチを生成します(Generating patch text with -p を参照)。

-s
--no-patch

diff マシンからのすべての出力を抑制します。デフォルトでパッチを表示する git show のようなコマンドの出力を抑制したり、コマンドラインで前に指定された --patch--stat のようなオプションの効果をエイリアスでキャンセルしたりするのに役立ちます。

-m

マージコミットの diff をデフォルトのフォーマットで表示します。これは *--diff-merges=on* と似ていますが、-m-p も指定されない限り出力を生成しません。

-c

マージコミットの combined diff 出力を生成します。 *--diff-merges=combined -p* のショートカットです。

--cc

マージコミットの dense combined diff 出力を生成します。 *--diff-merges=dense-combined -p* のショートカットです。

--dd

マージコミットと通常のコミットの両方について、最初の親に対する diff を生成します。 *--diff-merges=first-parent -p* のショートカットです。

--remerge-diff

マージコミットの remerge-diff 出力を生成します。 *--diff-merges=remerge -p* のショートカットです。

--no-diff-merges

*--diff-merges=off* の同義語です。

--diff-merges=<format>

マージコミットに使用される diff フォーマットを指定します。 --first-parent が使用されている場合を除き、デフォルトは `dense-combined` です。その場合、first-parent がデフォルトです。

以下のフォーマットがサポートされています

off, none

マージコミットの diff 出力を無効にします。暗黙的な値をオーバーライドするのに役立ちます。

on, m

マージコミットの diff 出力をデフォルトのフォーマットで表示します。デフォルトのフォーマットは log.diffMerges 設定変数を使用して変更できます。デフォルト値は separate です。

first-parent, 1

最初の親に対する完全な diff を表示します。これは、--patch がマージ以外のコミットに対して生成するのと同じフォーマットです。

separate

各親に対する完全な diff を表示します。各親について個別のログエントリと diff が生成されます。

combined, c

親と結果のペアワイズ diff を一度に1つずつ表示する代わりに、各親からマージ結果への違いを同時に表示します。さらに、すべての親から変更されたファイルのみをリストします。

dense-combined, cc

親の内容に2つのバリアントしかなく、マージ結果が変更なしにそのうちの1つを選択する、興味のないハンクを省略することにより、--diff-merges=combined によって生成される出力をさらに圧縮します。

remerge, r

2つの親を持つマージコミットを再マージして、一時的なツリーオブジェクトを作成します。これには、競合マーカーなどを含むファイルが含まれる可能性があります。その後、その一時ツリーと実際のマージコミットの diff が表示されます。

このオプションを使用した場合に出力される出力は変更される可能性があり、他のオプションとの相互作用も変更される可能性があります(明示的に文書化されていない限り)。

--combined-all-paths

このフラグは、combined diff(マージコミットに使用)にすべての親からのファイルの名前をリストさせます。したがって、--diff-merges=[dense-]combined が使用されている場合にのみ効果があり、ファイル名の変更が検出された場合(つまり、名前の変更またはコピーの検出が要求された場合)にのみ役立ちます。

-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 diff フォーマットを使用して変更の概要を表示します。 git-diff[1] の「RAW OUTPUT FORMAT」セクションを参照してください。これは、--format=raw で実現できる、ログ自体を raw フォーマットで表示することとは異なります。

--patch-with-raw

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

-t

diff 出力にツリーオブジェクトを表示します。

--indent-heuristic

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

--no-indent-heuristic

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

--minimal

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

--patience

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

--histogram

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

--anchored=<text>

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

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

ソースとデスティネーションの両方に存在する行が1つだけ存在し、このテキストで始まる場合、このアルゴリズムは、出力で削除または追加として表示されないようにしようとします。内部的には「patience diff」アルゴリズムを使用します。

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

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

defaultmyers

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

minimal

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

patience

パッチを生成する際に「patience diff」アルゴリズムを使用します。

histogram

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

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

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

diffstat を生成します。デフォルトでは、ファイル名部分に必要なだけのスペースが使用され、残りのスペースはグラフ部分に使用されます。最大幅はデフォルトで端末の幅、端末に接続されていない場合は80列になり、<width> で上書きできます。ファイル名部分の幅は、カンマの後に別の幅 <name-width> を指定するか、diff.statNameWidth=<width> を設定することで制限できます。グラフ部分の幅は、--stat-graph-width=<width> を使用するか、diff.statGraphWidth=<width> を設定することで制限できます。 --stat または --stat-graph-width を使用すると、統計グラフを生成するすべてのコマンドに影響しますが、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[<param1,param2,…​>]
--dirstat[=<param1,param2,…​>]

各サブディレクトリの相対的な変更量の分布を出力します。 --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[=<param1,param2>…​]

--dirstat=files,<param1>,<param2>…​ のシノニム

--summary

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

--patch-with-stat

-p --stat のシノニム。

-z

コミットを改行ではなく NUL で区切ります。

また、--raw または --numstat が指定されている場合は、パス名を変更せず、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 のシノニムです。これは、将来、より適切なモードに変更される可能性があります。

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=<modes>

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

no

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

ignore-space-at-eol

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

ignore-space-change

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

ignore-all-space

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

allow-indentation-change

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

--no-color-moved-ws

移動検出を実行するときに空白を無視しません。これは、構成設定をオーバーライドするために使用できます。 --color-moved-ws=no と同じです。

--word-diff[=<mode>]

<mode> を使用して変更された単語を区切り、単語差分を表示します。デフォルトでは、単語は空白で区切られます。以下の --word-diff-regex を参照してください。 <mode> はデフォルトで *plain* で、以下のいずれかでなければなりません。

color

色のみを使用して変更された単語を強調表示します。 --color を暗黙的に指定します。

plain(プレーン)

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

porcelain(ポーセリン)

スクリプトでの利用を目的とした特別な行ベースのフォーマットを使用します。追加/削除/変更されていない部分は、通常の unified diff 形式で出力され、行の先頭に +/-/` ` 文字が付加され、行末まで拡張されます。入力の改行は、それ自身の行にあるチルダ ~ で表されます。

none(なし)

単語差分を無効にします。

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

--word-diff-regex=<regex>

空白以外の文字列を単語と見なす代わりに、<regex> を使用して単語を決定します。また、--word-diff がまだ有効になっていない限り、それを暗黙的に有効にします。

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

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

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

--color-words[=<regex>]

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

--no-renames

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

--[no-]rename-empty

空の blob を名前変更のソースとして使用するかどうかの設定です。

--check

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

--ws-error-highlight=<kind>

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

--full-index

パッチ形式の出力を生成するときに、最初の数文字の代わりに、「index」行に完全な変更前と変更後の blob オブジェクト名を表示します。

--binary

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

--abbrev[=<n>]

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

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

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

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

-M と共に使用すると、完全に書き直されたファイルも名前変更のソースと見なされます(通常、-M は名前変更のソースとして消失したファイルのみを考慮します)。数値 n は -B オプションのこの側面を制御します(デフォルトは 50%)。 -B20% は、ファイルサイズの 20%以上と比較して追加と削除が行われた変更が、別のファイルへの名前変更のソースとして選択される対象となることを指定します。

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

差分を生成する場合、各コミットの名前変更を検出して報告します。履歴をたどりながら名前変更されたファイルを追跡するには、--follow を参照してください。 n が指定されている場合、それは類似性インデックス(つまり、ファイルサイズと比較した追加/削除の量)のしきい値です。たとえば、-M90% は、ファイルの 90%以上が変更されていない場合、Git は削除/追加のペアを名前変更と見なす必要があることを意味します。 % 記号がない場合、数値は小数点の前に小数点が付いた分数として読み取られます。つまり、-M5 は 0.5 になり、-M50% と同じです。同様に、-M05-M5% と同じです。検出を正確な名前変更に限定するには、-M100% を使用します。デフォルトの類似性インデックスは 50% です。

-C[<n>]
--find-copies[=<n>]

名前変更だけでなく、コピーも検出します。 --find-copies-harder も参照してください。 n が指定されている場合、-M<n> と同じ意味を持ちます。

--find-copies-harder

パフォーマンス上の理由から、デフォルトでは、-C オプションは、コピーの元のファイルが同じチェンジセットで変更された場合にのみコピーを見つけます。このフラグは、コマンドが変更されていないファイルをコピーのソースの候補として検査するようにします。これは、大規模プロジェクトでは非常にコストのかかる操作であるため、注意して使用してください。複数の -C オプションを指定しても同じ効果があります。

-D
--irreversible-delete

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

-B と共に使用すると、削除/作成ペアの削除部分の変更前のイメージも省略されます。

-l<num>

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

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

追加(A)、コピー(C)、削除(D)、変更(M)、名前変更(R)、タイプ変更(つまり、通常ファイル、シンボリックリンク、サブモジュールなど)(T)、マージされていない(U)、不明(X)、またはペアリングが壊れている(B)ファイルのみを選択します。フィルター文字の任意の組み合わせ(なしを含む)を使用できます。 *(全か無か)が組み合わせに追加されると、比較で他の基準に一致するファイルがある場合、すべてのパスが選択されます。他の基準に一致するファイルがない場合、何も選択されません。

また、これらの大文字は小文字にして除外することができます。たとえば、--diff-filter=ad は、追加および削除されたパスを除外します。

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

-S<string>

ファイル内で指定された文字列の出現回数(つまり、追加/削除)を変更する差分を探します。スクリプト作成者の使用を目的としています。

正確なコードブロック(構造体など)を探していて、それが最初に作成されてからの履歴を知りたい場合に便利です。この機能を反復的に使用して、変更前のイメージの対象となるブロックを -S にフィードバックし、ブロックの最初のバージョンを取得するまで続けます。

バイナリファイルも検索されます。

-G<regex>

パッチテキストに <regex> に一致する追加/削除された行が含まれている差分を探します。

-S<regex> --pickaxe-regex-G<regex> の違いを説明するために、同じファイルに次の差分があるコミットを考えてみます

+    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 または submodule commit です。ツリーも検索するために 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 パターンの順序によって決定されます。最初のパターンに一致するパス名を持つすべてのファイルが最初に output され、2 番目のパターンに一致する(ただし、最初の パターンには一致しない)パス名を持つすべてのファイルが次に output され、以降も同様です。どのパターンにも一致しないパス名を持つすべてのファイルは、ファイルの最後に暗黙的なすべてに一致するパターンがあるかのように、最後に output されます。複数のパス名が同じランクを持つ場合(同じパターンに一致するが、それ以前のパターンには一致しない場合)、互いに対する出力順序は通常の順序になります。

<orderfile> は次のように解析されます

  • 空行は無視されるため、可読性のために区切り文字として使用できます。

  • ハッシュ("#")で始まる行は無視されるため、コメントとして使用できます。パターンがハッシュで始まる場合は、パターンの先頭にバックスラッシュ("\")を追加します。

  • その他の各行には、単一のパターンが含まれています。

パターンは、FNM_PATHNAME フラグのない fnmatch(3) に使用されるパターンと同じ構文とセマンティクスを持ちます。ただし、任意の数の最後のパス名コンポーネントを削除したものがパターンに一致する場合、パス名もパターンに一致します。たとえば、パターン "foo*bar" は "fooasdfbar" と "foo/bar/baz/asdf" に一致しますが、"foobarx" には一致しません。

--skip-to=<file>
--rotate-to=<file>

指定された <file> より前のファイルを output から破棄する(つまり、*スキップする*)、または output の最後に移動する(つまり、*回転する*)。これらのオプションは、主に git difftool コマンドで使用するために考案されたものであり、それ以外ではあまり役に立たない可能性があります。

-R

2 つの入力を入れ替えます。つまり、インデックスまたはディスク上のファイルからツリーの内容への差分を表示します。

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

プロジェクトのサブディレクトリから実行する場合、このオプションを使用して、ディレクトリ外の変更を除外し、パス名をディレクトリからの相対パスで表示するように指示できます。サブディレクトリにいない場合(たとえば、ベアリポジトリの場合)、引数として <path> を指定することで、output を相対パスにするサブディレクトリを指定できます。 --no-relative は、diff.relative 設定オプションと以前の --relative の両方を無効にするために使用できます。

-a
--text

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

--ignore-cr-at-eol

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

--ignore-space-at-eol

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

-b
--ignore-space-change

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

-w
--ignore-all-space

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

--ignore-blank-lines

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

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

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

--inter-hunk-context=<lines>

diff hunk 間のコンテキストを、指定された行数まで表示し、互いに近い hunk を融合します。設定オプションが設定されていない場合は、diff.interHunkContext または 0 にデフォルト設定されます。

-W
--function-context

各変更のコンテキスト行として関数全体を表示します。関数名は、git diff がパッチ hunk ヘッダーを決定するのと同じ方法で決定されます(gitattributes[5] の *カスタム hunk ヘッダーの定義* を参照)。

--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[=<when>]

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

--src-prefix=<prefix>

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

--dst-prefix=<prefix>

"b/" の代わりに、指定された宛先プレフィックスを表示します。

--no-prefix

ソースまたは宛先プレフィックスを表示しません。

--default-prefix

デフォルトのソースおよび宛先プレフィックス("a/" および "b/")を使用します。これは、diff.noprefixdiff.srcPrefixdiff.dstPrefixdiff.mnemonicPrefix などの設定変数をオーバーライドします(git-config(1) を参照)。

--line-prefix=<prefix>

output のすべての行に追加のプレフィックスを付加します。

--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 オプションで生成される output は、従来の 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>

    ファイルモードは、ファイルタイプとファイルアクセス許可ビットを含む 6 桁の 8 進数として output されます。

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

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

    インデックス行には、変更前後の blob オブジェクト名が含まれています。ファイルモードが変更されない場合は <mode> が含まれます。そうでない場合は、変更前後のモードが別々の行に示されます。

  3. "珍しい" 文字を含むパス名は、設定変数 core.quotePath について説明されているように引用符で囲まれます(git-config[1] を参照)。

  4. output のすべての 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 ヘッダーの定義」を参照してください。

combined diff 形式

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

"combined diff" 形式は次のようになります

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

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

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

    diff --combined file

    または、次のように(--cc オプションが使用されている場合)

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

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

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

  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`に渡してしまうことを防ぐために変更されました。 combined diff フォーマットは、マージコミットの変更を確認するために作成されたもので、適用することを意図したものではありません。この変更は、拡張*インデックス*ヘッダーの変更と似ています。

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

    combined diff フォーマットのチャンクヘッダーには、(親の数 + 1)個の`@`文字があります。

`-`(マイナス - A には存在するが B では削除されている)、`+`(プラス - A にはないが B に追加されている)、または`" "`(スペース - 変更なし)のプレフィックスが付いた単一の列で2つのファイル A と B を表示する従来の*unified* diff フォーマットとは異なり、このフォーマットは、2つ以上のファイル file1、file2、…​ を1つのファイル X と比較し、X が各 fileN とどのように異なるかを示します。 fileN ごとに1つの列が出力行の先頭に追加され、X の行が fileN とどのように異なるかが示されます。

列 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、別名「自分たちのバージョン」、file2 はステージ3、別名「相手のバージョン」です)。

`git show v1.0.0`

タグ`v1.0.0`と、タグが指すオブジェクトを表示します。

`git show v1.0.0^{tree}`

タグ`v1.0.0`が指すツリーを表示します。

`git show -s --format=%s v1.0.0^{commit}`

タグ`v1.0.0`が指すコミットの件名を表示します。

`git show next~10:Documentation/README`

ブランチ`next`の10個前のコミット時点でのファイル`Documentation/README`の内容を表示します。

`git show master:Makefile master:t/Makefile`

ブランチ`master`の先頭にある上記の Makefile の内容を連結します。

考察

Git は、ある程度文字エンコーディングに依存しません。

  • BLOB オブジェクトの内容は、解釈されていないバイト列です。コアレベルではエンコーディングの変換は行われません。

  • パス名は UTF-8 normalization form C でエンコードされます。これは、ツリーオブジェクト、インデックスファイル、ref名、およびコマンドライン引数、環境変数、設定ファイル(`.git/config`(git-config[1] 参照)、gitignore[5]gitattributes[5]gitmodules[5])のパス名に適用されます。

    コアレベルでは、Git はパス名を単なる NUL 以外のバイト列として扱うため、パス名のエンコーディング変換は行われません(Mac と Windows を除く)。そのため、ASCII 以外のパス名を使用しても、レガシーの拡張 ASCII エンコーディングを使用するプラットフォームやファイルシステムでもほとんどの場合動作します。ただし、そのようなシステムで作成されたリポジトリは、UTF-8 ベースのシステム(Linux、Mac、Windows など)では正しく動作せず、逆もまた同様です。さらに、多くの Git ベースのツールはパス名が UTF-8 であると想定しているため、他のエンコーディングを正しく表示できません。

  • コミットログメッセージは通常 UTF-8 でエンコードされますが、他の拡張 ASCII エンコーディングもサポートされています。これには ISO-8859-x、CP125x などが含まれますが、UTF-16/32、EBCDIC、CJK マルチバイトエンコーディング(GBK、Shift-JIS、Big5、EUC-x、CP9xx など)は*含まれません*。

コミットログメッセージは UTF-8 でエンコードすることを推奨しますが、コアと Git Porcelain の両方は、プロジェクトに UTF-8 を強制しないように設計されています。特定のプロジェクトのすべての参加者がレガシーエンコーディングを使用する方が便利だと感じる場合、Git はそれを禁止しません。ただし、注意すべき点がいくつかあります。

  1. `git commit`と`git commit-tree`は、プロジェクトがレガシーエンコーディングを使用していると明示的に指定しない限り、渡されたコミットログメッセージが有効な UTF-8 文字列のように見えない場合に警告を発行します。これを指定するには、`.git/config`ファイルに`i18n.commitEncoding`を次のように記述します。

    [i18n]
    	commitEncoding = ISO-8859-1

    上記の 설정 で作成されたコミットオブジェクトは、`encoding`ヘッダーに`i18n.commitEncoding`の値を記録します。これは、後でそれらを確認する他の人々の助けとなるためです。このヘッダーがない場合は、コミットログメッセージが UTF-8 でエンコードされていることを意味します。

  2. `git log`、`git show`、`git blame`などは、コミットオブジェクトの`encoding`ヘッダーを確認し、特に指定がない限り、ログメッセージを UTF-8 に再コードしようとします。目的の出力エンコーディングは、`.git/config`ファイルの`i18n.logOutputEncoding`で指定できます。次のようにします。

    [i18n]
    	logOutputEncoding = ISO-8859-1

    この設定変数がない場合は、代わりに`i18n.commitEncoding`の値が使用されます。

UTF-8 への再コーディングは必ずしも可逆操作ではないため、コミットオブジェクトレベルで UTF-8 を強制するためにコミットが行われたときにコミットログメッセージを意図的に再コードしないようにしました。

GIT

git[1] スイートの一部

scroll-to-top