日本語 ▾ トピック ▾ 最新バージョン ▾ git-log 最終更新: 2.49.0

名前

git-log - コミットログを表示

概要

git log [<options>] [<revision-range>] [[--] <path>…​]

説明

コミットログを表示します。

与えられたコミットから`parent`リンクを辿って到達可能なコミットをリストしますが、先頭に*^*が付いているコミットから到達可能なコミットは除外します。出力はデフォルトで逆時系列順になります。

これは集合演算として考えることができます。コマンドラインで与えられた任意のコミットから到達可能なコミットは集合を形成し、そこから先頭に*^*が付いた任意のコミットから到達可能なコミットがその集合から減算されます。残りのコミットがコマンドの出力として表示されます。様々な他のオプションとパスパラメータを使用して、結果をさらに制限することができます。

したがって、以下のコマンドは

$ git log foo bar ^baz

「*foo*または*bar*から到達可能だが、*baz*からは到達できないすべてのコミットをリストする」ことを意味します。

特殊な表記「**..**」は、「^** **」の省略形として使用できます。例えば、以下のいずれも互換的に使用できます。

$ git log origin..HEAD
$ git log HEAD ^origin

もう一つの特殊な表記は「**…​**」で、これはマージに役立ちます。結果として得られるコミットの集合は、2つのオペランド間の対称差です。以下の2つのコマンドは同等です。

$ git log A B --not $(git merge-base --all A B)
$ git log A...B

このコマンドは、表示内容と表示方法を制御するためのgit-rev-list[1]コマンドに適用可能なオプションと、各コミットが導入する変更の表示方法を制御するためのgit-diff[1]コマンドに適用可能なオプションを受け入れます。

オプション

--follow

ファイル名の変更後もファイルの履歴をリストし続けます(単一のファイルのみに適用)。

--no-decorate
--decorate[=short|full|auto|no]

表示されるすべてのコミットの参照名を出力します。*short*が指定された場合、参照名プレフィックス*refs/heads/*、*refs/tags/*、*refs/remotes/*は表示されません。*full*が指定された場合、完全な参照名(プレフィックスを含む)が表示されます。*auto*が指定された場合、出力がターミナル向けであれば*short*が指定されたかのように参照名が表示され、それ以外の場合は参照名は表示されません。`--decorate`オプションは`--decorate=short`の省略形です。設定されている場合は`log.decorate`の構成値に、そうでない場合は`auto`にデフォルト設定されます。

--decorate-refs=<pattern>
--decorate-refs-exclude=<pattern>

各候補参照について、`--decorate-refs-exclude`に与えられたパターンに一致する場合、または`--decorate-refs`に与えられたどのパターンにも一致しない場合は、装飾として使用しません。`log.excludeDecoration`設定オプションを使用すると、装飾から参照を除外できますが、明示的な`--decorate-refs`パターンは`log.excludeDecoration`での一致を上書きします。

これらのオプションや設定がどれも指定されていない場合、参照が`HEAD`、`refs/heads/`、`refs/remotes/`、`refs/stash/`、または`refs/tags/`に一致する場合、装飾として使用されます。

--clear-decorations

指定された場合、このオプションは以前のすべての`--decorate-refs`または`--decorate-refs-exclude`オプションをクリアし、デフォルトの装飾フィルターを緩和してすべての参照を含めます。`log.initialDecorationSet`設定値が`all`に設定されている場合、このオプションが想定されます。

--source

各コミットが到達したコマンドラインで指定された参照名を出力します。

--[no-]mailmap
--[no-]use-mailmap

mailmapファイルを使用して、著者とコミッターの名前およびメールアドレスを正規の実名とメールアドレスにマッピングします。git-shortlog[1]を参照してください。

--full-diff

このフラグがない場合、`git log -p ...`は指定されたパスに影響するコミットと、同じ指定されたパスに関する差分を表示します。このフラグを使用すると、指定されたパスに影響するコミットに対して完全な差分が表示されます。これは、「…」がコミットのみを制限し、それらのコミットの差分は制限しないことを意味します。

これは、`--stat`などで生成されるものを含む、すべての差分ベースの出力タイプに影響することに注意してください。

--log-size

各コミットの出力に「log size 」という行を含めます。ここではそのコミットのメッセージのバイト長です。`git log`出力からログメッセージを読み取るツールが、事前にスペースを割り当てることで高速化することを目的としています。

-L,:
-L::

*,*で指定された行範囲、または関数名正規表現**で指定された行範囲の、**内の変遷を追跡します。パス指定の制限子は指定できません。これは現在、単一のリビジョンから開始するウォークに限定されており、つまり、0または1つの正のリビジョン引数のみを指定でき、**と**(または**)は開始リビジョンに存在する必要があります。このオプションは複数回指定できます。`--patch`を暗黙的に指定します。パッチ出力は`--no-patch`を使用して抑制できますが、他の差分形式(具体的には`--raw`、`--numstat`、`--shortstat`、`--dirstat`、`--summary`、`--name-only`、`--name-status`、`--check`)は現在実装されていません。

**と**は、以下のいずれかの形式を取ることができます

  • 数値

    もし**または**が数値の場合、絶対行番号(行は1から数えます)を指定します。

  • /正規表現/

    この形式は、指定されたPOSIX正規表現に一致する最初の行を使用します。**が正規表現の場合、前の`-L`範囲の終わりから検索します(存在する場合)。それ以外の場合はファイルの先頭から検索します。**が`^/regex/`の場合、ファイルの先頭から検索します。**が正規表現の場合、**で指定された行から検索を開始します。

  • +オフセットまたは-オフセット

    これは**にのみ有効で、**で指定された行の前後の行数を指定します。

**と**の代わりに`:`が与えられた場合、それは**に一致する最初の関数名行から次の関数名行までの範囲を示す正規表現です。`:`は、前の`-L`範囲の終わりから検索します(存在する場合)。それ以外の場合はファイルの先頭から検索します。`^:`はファイルの先頭から検索します。関数名は、`git diff`がパッチハンクヘッダーを決定する方法と同じ方法で決定されます(gitattributes[5]の「*カスタムハンクヘッダーの定義*」を参照)。

<リビジョン範囲>

指定されたリビジョン範囲内のコミットのみを表示します。が指定されていない場合、デフォルトで`HEAD`(つまり、現在のコミットに至る全履歴)になります。`origin..HEAD`は、現在のコミット(つまり`HEAD`)から到達可能だが、`origin`からは到達できないすべてのコミットを指定します。の完全な指定方法については、gitrevisions[7]の「*範囲の指定*」セクションを参照してください。

[--] …​

指定されたパスに一致するファイルがどのようにして作成されたかを説明するのに十分なコミットのみを表示します。詳細およびその他の簡素化モードについては、下記の「*履歴の簡素化*」を参照してください。

混乱が生じる場合、パスはオプションやリビジョン範囲と区別するために`--`を接頭辞として付ける必要がある場合があります。

コミットの制限

説明で説明されている特殊な表記を使用してリストすべきコミットの範囲を指定する以外に、追加のコミット制限を適用することができます。

特に断りのない限り、より多くのオプションを使用すると、一般的に出力がさらに制限されます(例: `--since=`は``より新しいコミットに制限し、これを`--grep=`と併用すると、ログメッセージに``に一致する行があるコミットにさらに制限します)。

これらは、`--reverse`などのコミット順序付けオプションや書式設定オプションの前に適用されることに注意してください。

-
-n
--max-count=

出力するコミット数を制限します。

--skip=

コミット出力の表示を開始する前に、*number*個のコミットをスキップします。

--since=
--after=

特定の年月日より新しいコミットを表示します。

--since-as-filter=

特定の年月日より新しいすべてのコミットを表示します。これは、特定の年月日より古い最初のコミットで停止するのではなく、範囲内のすべてのコミットを訪問します。

--until=
--before=

特定の年月日より古いコミットを表示します。

--author=
--committer=

指定されたパターン(正規表現)に一致するauthor/committerヘッダー行を持つコミットに出力を制限します。複数の`--author=`を指定した場合、与えられたパターンのいずれかに著者が一致するコミットが選択されます(複数の`--committer=`についても同様です)。

--grep-reflog=

指定されたパターン(正規表現)に一致するreflogエントリを持つコミットに出力を制限します。複数の`--grep-reflog`を指定した場合、与えられたパターンのいずれかにreflogメッセージが一致するコミットが選択されます。`--walk-reflogs`が使用されていない限り、このオプションを使用することはエラーです。

--grep=

指定されたパターン(正規表現)に一致するログメッセージを持つコミットに出力を制限します。複数の`--grep=`を指定した場合、与えられたパターンのいずれかにメッセージが一致するコミットが選択されます(ただし、`--all-match`も参照)。

`--notes`が有効な場合、注釈からのメッセージはログメッセージの一部であるかのように照合されます。

--all-match

少なくとも1つに一致するコミットではなく、指定されたすべての`--grep`に一致するコミットに出力を制限します。

--invert-grep

`--grep=`で指定されたパターンに一致しないログメッセージを持つコミットに出力を制限します。

-i
--regexp-ignore-case

正規表現の制限パターンを大文字小文字を区別せずに照合します。

--basic-regexp

制限パターンを基本正規表現と見なします。これがデフォルトです。

-E
--extended-regexp

制限パターンをデフォルトの基本正規表現ではなく、拡張正規表現と見なします。

-F
--fixed-strings

制限パターンを固定文字列と見なします(パターンを正規表現として解釈しません)。

-P
--perl-regexp

制限パターンをPerl互換正規表現と見なします。

これらの種類の正規表現のサポートは、オプションのコンパイル時依存関係です。Gitがそれらをサポートするようにコンパイルされていない場合、このオプションを指定すると終了します。

--remove-empty

指定されたパスがツリーから消えたときに停止します。

--merges

マージコミットのみを出力します。これは`--min-parents=2`とまったく同じです。

--no-merges

複数の親を持つコミットは出力しません。これは`--max-parents=1`とまったく同じです。

--min-parents=<number>
--max-parents=<number>
--no-min-parents
--no-max-parents

指定された数以上の(または以下の)親コミットを持つコミットのみを表示します。特に、`--max-parents=1`は`--no-merges`と同じであり、`--min-parents=2`は`--merges`と同じです。`--max-parents=0`はすべてのルートコミットを、`--min-parents=3`はすべてのオクトパスマージを表示します。

`--no-min-parents`と`--no-max-parents`は、これらの制限を(制限なしに)再びリセットします。同等の形式は、`--min-parents=0`(任意のコミットは0個以上の親を持つ)と`--max-parents=-1`(負の数値は上限なしを意味する)です。

--first-parent

含めるコミットを検索する際、マージコミットを見た場合にのみ最初の親コミットをたどります。このオプションは、特定のトピックブランチの進化を表示する際に、より良い概要を提供できます。なぜなら、トピックブランチへのマージは、時々更新されたアップストリームへの調整に過ぎない傾向があり、このオプションは、そのようなマージによって履歴に取り込まれた個々のコミットを無視することを可能にするからです。

このオプションは、マージコミットのデフォルトの差分フォーマットを`first-parent`に変更します。詳細は`--diff-merges=first-parent`を参照してください。

--exclude-first-parent-only

除外するコミット(*^*が付いているもの)を検索する際、マージコミットを見た場合にのみ最初の親コミットをたどります。これは、任意の merges が有効なトピックブランチの変更となりうることを考慮すると、リモートブランチから分岐した時点からのトピックブランチ内の変更セットを見つけるために使用できます。

--not

次に`--not`が来るまで、続くすべてのリビジョン指定子に対する*^*プレフィックスの意味(またはその欠如)を反転させます。コマンドラインで`--stdin`の前に使用した場合、stdinを介して渡されるリビジョンには影響しません。逆に、標準入力経由で渡された場合、コマンドラインで渡されたリビジョンには影響しません。

--all

`refs/`内のすべての参照と`HEAD`が、コマンドラインで**としてリストされているかのように振る舞います。

--branches[=<pattern>]

`refs/heads`内のすべての参照が、コマンドラインで**としてリストされているかのように振る舞います。**が指定された場合、指定されたシェルグロブに一致するブランチに制限します。パターンに*?*、**、または*[**がない場合、末尾に*/**が暗黙的に付加されます。

--tags[=<pattern>]

`refs/tags`内のすべての参照が、コマンドラインで**としてリストされているかのように振る舞います。**が指定された場合、指定されたシェルグロブに一致するタグに制限します。パターンに*?*、**、または*[**がない場合、末尾に*/**が暗黙的に付加されます。

--remotes[=<pattern>]

`refs/remotes`内のすべての参照が、コマンドラインで**としてリストされているかのように振る舞います。**が指定された場合、指定されたシェルグロブに一致するリモート追跡ブランチに制限します。パターンに*?*、**、または*[**がない場合、末尾に*/**が暗黙的に付加されます。

--glob=<glob-pattern>

シェルグロブ**に一致するすべての参照が、コマンドラインで**としてリストされているかのように振る舞います。先頭の*refs/*が欠けている場合、自動的に付加されます。パターンに*?*、**、または*[**がない場合、末尾に*/**が暗黙的に付加されます。

--exclude=<glob-pattern>

次に続く`--all`、`--branches`、`--tags`、`--remotes`、または`--glob`が通常考慮するであろう**に一致する参照を含めません。このオプションを繰り返すと、次に`--all`、`--branches`、`--tags`、`--remotes`、または`--glob`オプションが来るまで除外パターンが蓄積されます(他のオプションや引数は蓄積されたパターンをクリアしません)。

与えられたパターンは、それぞれ`--branches`、`--tags`、`--remotes`に適用される場合、`refs/heads`、`refs/tags`、`refs/remotes`で始まってはならず、`--glob`または`--all`に適用される場合、`refs/`で始まなければなりません。末尾に*/**を意図する場合は、明示的に指定する必要があります。

--exclude-hidden=[fetch|receive|uploadpack]

適切な`fetch.hideRefs`、`receive.hideRefs`、`uploadpack.hideRefs`の設定と`transfer.hideRefs`(git-config[1]を参照)を参照することで、`git-fetch`、`git-receive-pack`、`git-upload-pack`によって隠される参照を含めません。このオプションは、次に続く擬似参照オプション`--all`または`--glob`に影響し、それらの処理後にクリアされます。

--reflog

reflogによって言及されたすべてのオブジェクトが、コマンドラインで``としてリストされているかのように振る舞います。

--alternate-refs

代替リポジトリの参照ティップとして言及されたすべてのオブジェクトがコマンドラインにリストされているかのように振る舞います。代替リポジトリとは、オブジェクトディレクトリが`objects/info/alternates`に指定されているすべてのリポジトリです。含まれるオブジェクトのセットは、`core.alternateRefsCommand`などによって変更される可能性があります。git-config[1]を参照してください。

--single-worktree

デフォルトでは、複数の作業ツリーが存在する場合(git-worktree[1]を参照)、以下のオプションによってすべての作業ツリーが検査されます: `--all`、`--reflog`、`--indexed-objects`。このオプションは、これらのオプションが現在の作業ツリーのみを検査するように強制します。

--ignore-missing

入力に無効なオブジェクト名が見つかった場合、その無効な入力が与えられなかったかのように振る舞います。

--bisect

悪いバイセクト参照`refs/bisect/bad`がリストされ、それに続いて`--not`と良いバイセクト参照`refs/bisect/good-*`がコマンドラインに指定されたかのように振る舞います。

--stdin

コマンドラインから引数を受け取るだけでなく、標準入力からも読み取ります。これはコミットや`--all`や`--glob=`のような擬似オプションを受け入れます。`--`区切り文字が見つかった場合、それに続く入力はパスとして扱われ、結果を制限するために使用されます。標準入力経由で読み取られる`--not`のようなフラグは、同じ方法で渡された引数に対してのみ尊重され、それ以降のコマンドライン引数には影響しません。

--cherry-mark

`--cherry-pick`(下記参照)と同様ですが、同等のコミットを省略するのではなく`=`でマークし、同等でないコミットを`+`でマークします。

--cherry-pick

コミットのセットが対称差で制限されている場合、「反対側」の別のコミットと同じ変更を導入するコミットはすべて省略します。

例えば、`A`と`B`の2つのブランチがある場合、それらの片側のコミットのみをリストする一般的な方法は`--left-right`を使用することです(`--left-right`オプションの説明にある例を参照)。しかし、これは別のブランチからチェリーピックされたコミット(例えば、「b上の3番目」はブランチAからチェリーピックされたものかもしれません)を表示します。このオプションを使用すると、そのようなコミットのペアは出力から除外されます。

--left-only
--right-only

対称差のそれぞれの側のコミットのみをリストします。つまり、`--left-right`によってそれぞれ`<`または`>`とマークされるもののみです。

例えば、`--cherry-pick --right-only A...B`は、`A`にあるか、`A`のコミットとパッチ的に同等である`B`からのコミットを省略します。言い換えれば、これは`git cherry A B`からの`+`コミットをリストします。より正確には、`--cherry-pick --right-only --no-merges`が正確なリストを提供します。

--cherry

`--right-only --cherry-mark --no-merges`の同義語です。`git cherry upstream mybranch`と同様に、`git log --cherry upstream...mybranch`を使用して、私たちの側のコミットに限定し、フォークされた履歴の反対側に適用されたコミットをマークするのに役立ちます。

-g
--walk-reflogs

コミットの祖先チェインを辿る代わりに、最新のreflogエントリから古いものへとreflogエントリを辿ります。このオプションを使用する場合、除外するコミットを指定することはできません(つまり、*^commit*、*commit1..commit2*、および*commit1...commit2*の表記は使用できません)。

`oneline`と`reference`以外の`--pretty`形式(明白な理由により)を使用すると、出力にreflogから取得した追加の2行の情報が含まれます。出力のreflog指定子は、いくつかのルールに応じて、`ref@{}`(**はreflog内の逆時系列インデックス)または`ref@{}`(そのエントリの**付き)として表示される場合があります。

  1. 開始点が`ref@{}`として指定された場合、インデックス形式を表示します。

  2. 開始点が`ref@{now}`として指定された場合、タイムスタンプ形式を表示します。

  3. どちらも使用されず、`--date`がコマンドラインで指定された場合、`--date`で要求された形式でタイムスタンプを表示します。

  4. それ以外の場合は、インデックス形式を表示します。

`--pretty=oneline`の場合、コミットメッセージの先頭にこの情報が同じ行に表示されます。このオプションは`--reverse`と組み合わせることはできません。git-reflog[1]も参照してください。

`--pretty=reference`の場合、この情報はまったく表示されません。

--merge

`HEAD...`の範囲で衝突しているパスに影響するコミットを表示します。ここで``は`MERGE_HEAD`、`CHERRY_PICK_HEAD`、`REVERT_HEAD`、`REBASE_HEAD`のいずれかで最初に存在する擬似参照です。インデックスに未マージのエントリがある場合にのみ機能します。このオプションは、3-wayマージから衝突を解決する際に、関連するコミットを表示するために使用できます。

--boundary

除外された境界コミットを出力します。境界コミットには`-`が接頭辞として付加されます。

履歴の簡素化

履歴の一部、例えば特定のを変更したコミットにのみ関心がある場合があります。しかし、「*履歴の簡素化*」には2つの側面があります。1つはコミットを選択すること、もう1つはそれをどのように行うかであり、履歴を簡素化するための様々な戦略が存在します。

以下のオプションは表示されるコミットを選択します

<パス>

指定されたを変更するコミットが選択されます。

--simplify-by-decoration

何らかのブランチまたはタグによって参照されるコミットが選択されます。

意味のある履歴を示すために、追加のコミットが表示される場合があることに注意してください。

以下のオプションは簡素化の実行方法に影響します

デフォルトモード

履歴を、ツリーの最終状態を説明する最も単純な履歴に簡素化します。最終結果が同じである場合(つまり、同じ内容のブランチをマージする場合)、一部のサイドブランチを剪定するため、最も単純です。

--show-pulls

デフォルトモードのすべてのコミットを含みますが、最初の親とはTREESAMEではないが、より後の親とはTREESAMEであるすべてのマージコミットも含まれます。このモードは、ブランチに「最初に変更を導入した」マージコミットを表示するのに役立ちます。

--full-history

デフォルトモードと同じですが、一部の履歴を剪定しません。

--dense

選択されたコミットのみが表示され、意味のある履歴のためにいくつか追加されます。

--sparse

簡素化された履歴内のすべてのコミットが表示されます。

--simplify-merges

`--full-history`の追加オプションで、このマージに貢献する選択されたコミットがないため、結果の履歴から不要なマージをいくつか削除します。

--ancestry-path[=<commit>]

表示するコミット範囲(例: *commit1..commit2*または*commit2 ^commit1*)と、その範囲内のコミットが指定された場合、その範囲内での祖先、の子孫、または自体であるコミットのみが表示されます。コミットが指定されていない場合、*commit1*(範囲の除外部分)をとして使用します。複数回渡すことができます。その場合、指定されたコミットのいずれかであるか、またはそれらのいずれかの祖先または子孫である場合にコミットが含まれます。

より詳細な説明が続きます。

仮に`foo`をとして指定したとします。`foo`を変更するコミットを!TREESAMEと呼び、残りをTREESAMEと呼びます。(`foo`でフィルタリングされた差分では、それぞれ異なって見え、等しく見えます。)

以下では、簡素化設定の違いを説明するために、常に同じ履歴例を参照します。このコミットグラフでファイル`foo`をフィルタリングしていると仮定します。

	  .-A---M---N---O---P---Q
	 /     /   /   /   /   /
	I     B   C   D   E   Y
	 \   /   /   /   /   /
	  `-------------'   X

履歴の水平線A---Qは、各マージの最初の親と見なされます。コミットは次のとおりです。

  • `I`は最初のコミットであり、`foo`は「asdf」という内容で存在し、ファイル`quux`は「quux」という内容で存在します。初期コミットは空のツリーと比較されるため、`I`は!TREESAMEです。

  • `A`では、`foo`は単に「foo」を含みます。

  • `B`は`A`と同じ変更を含みます。そのマージ`M`は自明であり、したがってすべての親に対してTREESAMEです。

  • `C`は`foo`を変更しませんが、そのマージ`N`は`foo`を「foobar」に変更するため、どの親に対してもTREESAMEではありません。

  • `D`は`foo`を「baz」に設定します。そのマージ`O`は`N`と`D`の文字列を結合して「foobarbaz」にします。つまり、どの親に対してもTREESAMEではありません。

  • `E`は`quux`を「xyzzy」に変更し、そのマージ`P`は文字列を結合して「quux xyzzy」にします。`P`は`O`に対してTREESAMEですが、`E`に対してはそうではありません。

  • `X`は新しいファイル`side`を追加した独立したルートコミットで、`Y`がそれを修正しました。`Y`は`X`に対してTREESAMEです。そのマージ`Q`は`P`に`side`を追加し、`Q`は`P`に対してTREESAMEですが、`Y`に対してはそうではありません。

`rev-list`は履歴を逆方向に辿り、`--full-history`および/または親の書き換え(`--parents`または`--children`経由)が使用されているかどうかに基づいてコミットを含めたり除外したりします。以下の設定が利用可能です。

デフォルトモード

コミットは、どの親に対してもTREESAMEでない場合に(ただし、これは変更可能です。下記の`--sparse`を参照)含まれます。コミットがマージで、かつ1つの親に対してTREESAMEだった場合、その親のみをたどります。(複数のTREESAMEな親がある場合でも、そのうちの1つだけをたどります。)そうでない場合は、すべての親をたどります。

これにより、次のようになります。

	  .-A---N---O
	 /     /   /
	I---------D

TREESAMEな親が存在する場合にのみその親をたどるというルールが、`B`を完全に考慮から外したことに注目してください。`C`は`N`を介して考慮されましたが、TREESAMEです。ルートコミットは空のツリーと比較されるため、`I`は!TREESAMEです。

親/子関係は`--parents`でのみ表示されますが、デフォルトモードで選択されるコミットには影響しないため、親ラインを表示しています。

--full-history (親の書き換えなし)

このモードはデフォルトと1点異なります: マージの親がどれか1つとTREESAMEであっても、常にすべての親をたどります。マージの複数の側でコミットが含まれていても、マージ自体が含まれるとは限りません!例では、次のようになります。

	I  A  B  N  D  O  P  Q

`M`は両方の親に対してTREESAMEであるため、除外されました。`E`、`C`、`B`はすべてウォークされましたが、`B`のみが!TREESAMEであったため、他は表示されません。

親の書き換えなしでは、コミット間の親/子関係について語ることは事実上不可能であるため、それらを非接続として表示しています。

--full-history (親の書き換えあり)

通常のコミットは、!TREESAMEである場合にのみ含まれます(ただし、これは変更可能です。下記の`--sparse`を参照)。

マージは常に含まれます。ただし、その親リストは書き換えられます。各親に沿って、それ自体が含まれていないコミットは剪定されます。これにより、次のようになります。

	  .-A---M---N---O---P---Q
	 /     /   /   /   /
	I     B   /   D   /
	 \   /   /   /   /
	  `-------------'

上記の書き換えなしの`--full-history`と比較してください。`E`はTREESAMEであるため剪定されましたが、Pの親リストは`E`の親である`I`を含むように書き換えられました。`C`と`N`、および`X`、`Y`、`Q`についても同様のことが起こりました。

上記の設定に加えて、TREESAMEが含まれるかどうかに影響するかを変更できます。

--dense

ウォークされたコミットは、どの親に対してもTREESAMEでない場合に含まれます。

--sparse

ウォークされたすべてのコミットが含まれます。

`--full-history`がない場合でも、これはマージを簡素化します。親の1つがTREESAMEであれば、その親のみをたどるため、マージの他の側面はウォークされません。

--simplify-merges

まず、親の書き換えを伴う`--full-history`と同じ方法で履歴グラフを構築します(上記を参照)。

次に、各コミット`C`を、最終履歴におけるその代替`C'`に以下のルールに従って簡素化します。

  • `C'`を`C`に設定します。

  • `C'`の各親`P`をその簡素化された`P'`に置き換えます。その過程で、他の親の祖先である親、または空のツリーに対してTREESAMEであるルートコミットを削除し、重複を排除しますが、TREESAMEであるすべての親を決して削除しないように注意してください。

  • この親の書き換え後、`C'`がルートコミットまたはマージコミット(親が0または1より多い)、境界コミット、または!TREESAMEである場合、そのまま残ります。それ以外の場合は、唯一の親に置き換えられます。

これの効果は、親の書き換えを伴う`--full-history`と比較することで最もよく示されます。例は次のようになります。

	  .-A---M---N---O
	 /     /       /
	I     B       D
	 \   /       /
	  `---------'

`--full-history`に対する`N`、`P`、`Q`の大きな違いに注目してください。

  • `N`の親リストから`I`が削除されました。なぜなら、`I`はもう一方の親`M`の祖先だからです。しかし、`N`は!TREESAMEであるため、そのまま残りました。

  • `P`の親リストも同様に`I`が削除されました。`P`は親が1つでTREESAMEであるため、完全に削除されました。

  • `Q`の親リストは`Y`が`X`に簡素化されました。`X`はTREESAMEルートであったため削除されました。`Q`は親が1つでTREESAMEであるため、完全に削除されました。

利用可能なもう1つの簡素化モードがあります

--ancestry-path[=<commit>]

表示されるコミットを、の祖先であるもの、の子孫であるもの、または自体であるものに限定します。

使用例として、以下のコミット履歴を考えてみましょう。

	    D---E-------F
	   /     \       \
	  B---C---G---H---I---J
	 /                     \
	A-------K---------------L--M

通常の*D..M*は、`M`の祖先であるコミットのセットを計算しますが、`D`の祖先であるコミットを除外します。これは、「`M`に存在するが`D`には存在しなかったものは何か」という点で、`D`以降に`M`に至る履歴に何が起こったかを確認するのに役立ちます。この例では、`A`と`B`(そしてもちろん`D`自体)を除くすべてのコミットが結果となります。

しかし、`D`によって導入されたバグで汚染され、修正が必要な`M`内のコミットを特定したい場合、実際に`D`の子孫である*D..M*のサブセットのみを表示したいかもしれません。つまり、`C`と`K`を除外します。これは`--ancestry-path`オプションが正確に行うことです。*D..M*範囲に適用すると、次のようになります。

		E-------F
		 \       \
		  G---H---I---J
			       \
				L--M

`--ancestry-path`の代わりに`--ancestry-path=D`を使用することもできます。これは*D..M*範囲に適用した場合、同じ意味ですが、より明示的です。

代わりに、この範囲内の特定のトピックと、そのトピックに影響されるすべてのコミットに関心がある場合、`D..M`のサブセットのうち、そのトピックを祖先パスに含むもののみを表示したいかもしれません。したがって、例えば`--ancestry-path=H D..M`を使用すると、次のようになります。

		E
		 \
		  G---H---I---J
			       \
				L--M

一方、`--ancestry-path=K D..M`では次のようになります。

		K---------------L--M

別のオプション、`--show-pulls`について議論する前に、新しい履歴例を作成する必要があります。

簡素化された履歴を見ているときにユーザーが直面する一般的な問題は、ファイルが変更されたことを知っているコミットが、そのファイルの簡素化された履歴に表示されないことです。新しい例を挙げて、そのような場合に`--full-history`や`--simplify-merges`といったオプションがどのように機能するかを示しましょう。

	  .-A---M-----C--N---O---P
	 /     / \  \  \/   /   /
	I     B   \  R-'`-Z'   /
	 \   /     \/         /
	  \ /      /\        /
	   `---X--'  `---Y--'

この例では、`I`が`file.txt`を作成し、`A`、`B`、`X`が異なる方法でそれを変更したとします。単一親コミット`C`、`Z`、`Y`は`file.txt`を変更しません。マージコミット`M`は、`A`と`B`の両方からの変更を含めるようにマージ競合を解決して作成されたため、どちらに対してもTREESAMEではありません。一方、マージコミット`R`は、`M`における`file.txt`の内容を無視し、`X`における`file.txt`の内容のみを採用して作成されました。したがって、`R`は`X`に対してTREESAMEですが、`M`に対してはそうではありません。最後に、`N`を作成するための自然なマージ解決は、`R`における`file.txt`の内容を採用することであるため、`N`は`R`に対してTREESAMEですが、`C`に対してはそうではありません。マージコミット`O`と`P`は、それぞれの最初の親に対してTREESAMEですが、2番目の親である`Z`と`Y`に対してはそうではありません。

デフォルトモードを使用すると、`N`と`R`の両方にTREESAMEな親があるため、それらのエッジが辿られ、他は無視されます。結果の履歴グラフは次のようになります。

	I---X

`--full-history`を使用すると、Gitはすべてのエッジを辿ります。これにより、コミット`A`と`B`、およびマージ`M`が発見されますが、マージコミット`O`と`P`も明らかになります。親の書き換えを伴う場合、結果のグラフは次のようになります。

	  .-A---M--------N---O---P
	 /     / \  \  \/   /   /
	I     B   \  R-'`--'   /
	 \   /     \/         /
	  \ /      /\        /
	   `---X--'  `------'

ここで、マージコミット`O`と`P`は余分なノイズを加えています。なぜなら、これらは実際には`file.txt`に変更を貢献していないからです。これらは単に古いバージョンの`file.txt`に基づいたトピックをマージしただけです。これは、多くのコントリビューターが並行して作業し、トピックブランチを単一のトランクにマージするワークフローを使用するリポジトリでよく見られる問題です。`--full-history`の結果には、多数の無関係なマージが表示されます。

`--simplify-merges`オプションを使用すると、コミット`O`と`P`は結果から消えます。これは、`O`と`P`の書き換えられた2番目の親が、その最初の親から到達可能であるためです。それらのエッジは削除され、その後コミットは、その親に対してTREESAMEである単一親コミットのように見えます。これはコミット`N`にも発生し、結果として次のような履歴ビューが得られます。

	  .-A---M--.
	 /     /    \
	I     B      R
	 \   /      /
	  \ /      /
	   `---X--'

このビューでは、`A`、`B`、`X`からの重要な単一親の変更をすべて確認できます。また、慎重に解決されたマージ`M`と、それほど慎重に解決されなかったマージ`R`も確認できます。これは通常、デフォルトビューでコミット`A`と`B`が履歴から「消えた」理由を特定するのに十分な情報です。ただし、このアプローチにはいくつかの問題があります。

最初の問題はパフォーマンスです。これまでのどのオプションとも異なり、`--simplify-merges`オプションは、単一の結果を返す前にコミット履歴全体をウォークする必要があります。これにより、非常に大規模なリポジトリではこのオプションの使用が困難になる場合があります。

2番目の問題は監査に関するものです。多くのコントリビューターが同じリポジトリで作業している場合、どのマージコミットが重要なブランチに変更を導入したかが重要です。上記の問題のあるマージ`R`は、重要なブランチにマージするために使用されたマージコミットである可能性は低いです。代わりに、マージ`N`が`R`と`X`を重要なブランチにマージするために使用されました。このコミットのコミットメッセージには、変更`X`が`A`と`B`からの変更を上書きするようになった理由に関する情報が含まれている可能性があります。

--show-pulls

デフォルトの履歴に表示されるコミットに加えて、最初の親とはTREESAMEではないが、より後の親とはTREESAMEである各マージコミットを表示します。

`--show-pulls`によってマージコミットが含まれる場合、そのマージは別のブランチから変更を「プル」したかのように扱われます。この例で`--show-pulls`を使用した場合(他のオプションなし)、結果のグラフは次のようになります。

	I---X---R---N

ここでは、マージコミット`R`と`N`が含まれています。それぞれ`X`と`R`をベースブランチにプルしたためです。これらのマージが、コミット`A`と`B`がデフォルト履歴に表示されない理由です。

`--show-pulls`と`--simplify-merges`を組み合わせると、グラフには必要なすべての情報が含まれます。

	  .-A---M--.   N
	 /     /    \ /
	I     B      R
	 \   /      /
	  \ /      /
	   `---X--'

`M`が`R`から到達可能であるため、`N`から`M`へのエッジが簡素化されて除去されたことに注意してください。しかし、`N`は変更`R`をメインブランチに「プル」したため、重要なコミットとして履歴に依然として表示されます。

`--simplify-by-decoration`オプションを使用すると、タグによって参照されていないコミットを省略することで、履歴のトポロジーの全体像のみを表示できます。コミットは、(1) タグによって参照されている場合、または (2) コマンドラインで指定されたパスの内容を変更する場合、!TREESAMEとマークされます(言い換えれば、上記の履歴簡素化ルールに従って保持されます)。その他のすべてのコミットはTREESAMEとマークされます(簡素化の対象となります)。

コミットの順序付け

デフォルトでは、コミットは逆時系列順に表示されます。

--date-order

すべての子が表示されるまで親を表示せず、それ以外の場合はコミットのタイムスタンプ順にコミットを表示します。

--author-date-order

すべての子が表示されるまで親を表示せず、それ以外の場合は著者のタイムスタンプ順にコミットを表示します。

--topo-order

すべての子が表示されるまで親を表示せず、複数の履歴行にまたがるコミットが混在して表示されないようにします。

例えば、次のようなコミット履歴では

    ---1----2----4----7
	\	       \
	 3----5----6----8---

ここで数字はコミットタイムスタンプの順序を示しており、`git rev-list`とその関連コマンドは`--date-order`を使用してコミットをタイムスタンプ順に表示します: 8 7 6 5 4 3 2 1。

`--topo-order`を使用すると、8 6 5 3 7 4 2 1(または8 7 4 2 6 5 3 1)と表示されます。これは、2つの並行開発トラックからのコミットが混ざって表示されるのを避けるために、一部の古いコミットが新しいコミットの前に表示されるためです。

--reverse

表示対象として選択されたコミット(上記の「コミットの制限」セクションを参照)を逆順で出力します。`--walk-reflogs`とは組み合わせることができません。

オブジェクトの走査

これらのオプションは、主にGitリポジトリのパッキングを目的としています。

--no-walk[=(sorted|unsorted)]

指定されたコミットのみを表示し、その祖先を辿りません。範囲が指定されている場合、これは効果がありません。引数`unsorted`が与えられた場合、コミットはコマンドラインで与えられた順序で表示されます。それ以外の場合(`sorted`または引数が与えられなかった場合)、コミットはコミットタイムの逆時系列順に表示されます。`--graph`とは組み合わせることができません。

--do-walk

以前の`--no-walk`を上書きします。

コミットのフォーマット

--pretty[=<format>]
--format=<format>

コミットログの内容を指定された形式で整形して出力します。ここで**は、*oneline*、*short*、*medium*、*full*、*fuller*、*reference*、*email*、*raw*、*format:*、*tformat:*のいずれかです。**が上記に該当せず、*%placeholder*が含まれている場合、*--pretty=tformat:*が指定されたかのように動作します。

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

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

--abbrev-commit

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

これにより、「--pretty=oneline」は80カラム端末を使用する人々にとって格段に読みやすくなるはずです。

--no-abbrev-commit

完全な40バイトの16進数コミットオブジェクト名を表示します。これは、明示的または`--oneline`などの他のオプションによって暗黙的に指定された`--abbrev-commit`を打ち消します。また、`log.abbrevCommit`変数も上書きします。

--oneline

これは「--pretty=oneline --abbrev-commit」をまとめて使用する省略形です。

--encoding=<encoding>

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

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

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

デフォルトでは、ログメッセージを4スペースインデントする整形形式(つまり、デフォルトである*medium*、*full*、*fuller*)ではタブが展開されます。

--notes[=<ref>]

コミットログメッセージを表示する際に、コミットに注釈を付けるノート(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[=<ref>]
--[no-]standard-notes

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

--show-signature

署名されたコミットオブジェクトの有効性を、署名を`gpg --verify`に渡して検証し、その出力を表示します。

--relative-date

`--date=relative`の同義語です。

--date=<format>

`--pretty`を使用する場合など、人間が読める形式で表示される日付にのみ効果があります。`log.date`設定変数は、logコマンドの`--date`オプションのデフォルト値を設定します。デフォルトでは、日付は元のタイムゾーン(コミッターまたは作者のタイムゾーン)で表示されます。`-local`が形式に追加された場合(例: `iso-local`)、代わりにユーザーのローカルタイムゾーンが使用されます。

`--date=relative`は、現在時刻からの相対的な日付、例えば「2 hours ago」(2時間前)を表示します。`-local`オプションは`--date=relative`には影響しません。

`--date=local`は`--date=default-local`のエイリアスです。

`--date=iso`(または`--date=iso8601`)は、ISO 8601に似た形式でタイムスタンプを表示します。厳密なISO 8601形式との違いは次のとおりです。

  • `T`の日付/時刻区切り文字の代わりにスペース

  • 時刻とタイムゾーンの間にスペース

  • タイムゾーンの時と分の間にコロンなし

`--date=iso-strict`(または`--date=iso8601-strict`)は、厳密なISO 8601形式でタイムスタンプを表示します。

`--date=rfc`(または`--date=rfc2822`)は、RFC 2822形式でタイムスタンプを表示します。これはEメールメッセージでよく見られます。

`--date=short`は、年月日のみを`YYYY-MM-DD`形式で表示し、時刻は表示しません。

`--date=raw`は、日付をエポック(1970-01-01 00:00:00 UTC)からの秒数として表示し、その後にスペース、そしてUTCからのオフセットとしてのタイムゾーン(4桁の`+`または`-`で、最初の2桁が時間、次の2桁が分)を表示します。つまり、タイムスタンプが`strftime("%s %z")`でフォーマットされたかのように表示されます。`-local`オプションはエポックからの秒数(常にUTCで測定されます)には影響しませんが、付随するタイムゾーンの値は切り替えます。

`--date=human`は、タイムゾーンが現在のタイムゾーンと一致しない場合にタイムゾーンを表示し、一致する場合は日付全体を表示しません(つまり、「今年」の日付の年の表示をスキップしますが、過去数日以内の日付で曜日を言うだけで済む場合は日付全体もスキップします)。古い日付の場合、時と分も省略されます。

`--date=unix`は、日付をUnixエポックタイムスタンプ(1970年からの秒数)として表示します。`--raw`と同様に、これは常にUTCであり、`-local`は影響しません。

`--date=format:...`は、%s、%z、%Zを除いて、指定された形式をシステム`strftime`に渡します。これらは内部で処理されます。`--date=format:%c`を使用して、システムロケールで推奨される形式で日付を表示します。書式指定子の完全なリストについては、`strftime`マニュアルを参照してください。`-local`を使用する場合、正しい構文は`--date=format-local:...`です。

`--date=default`はデフォルトの形式であり、ctime(3)の出力に基づいています。これは、3文字の曜日、3文字の月、日、"HH:MM:SS"形式の時分秒、それに続く4桁の年、およびタイムゾーン情報(ローカルタイムゾーンが使用されていない場合)を含む単一行を表示します。例: `Thu Jan 1 00:00:00 1970 +0000`。

--parents

コミットの親も出力します(「commit parent…​」の形式で)。また、親の書き換えも有効になります。上記の「*履歴の簡素化*」を参照してください。

--children

コミットの子も出力します(「commit child…​」の形式で)。また、親の書き換えも有効になります。上記の「*履歴の簡素化*」を参照してください。

--left-right

対称差のどちら側からコミットが到達可能かをマークします。左側のコミットには`<`が、右側のコミットには`>`が接頭辞として付きます。`--boundary`と組み合わせた場合、それらのコミットには`-`が接頭辞として付きます。

例えば、次のようなトポロジーの場合

	     y---b---b  branch B
	    / \ /
	   /   .
	  /   / \
	 o---x---a---a  branch A

次のような出力が得られます

	$ git rev-list --left-right --boundary --pretty=oneline A...B

	>bbbbbbb... 3rd on b
	>bbbbbbb... 2nd on b
	<aaaaaaa... 3rd on a
	<aaaaaaa... 2nd on a
	-yyyyyyy... 1st on b
	-xxxxxxx... 1st on a
--graph

出力の左側にコミット履歴のテキストベースのグラフィカルな表現を描画します。これにより、グラフ履歴が適切に描画されるように、コミットの間に余分な行が出力される場合があります。`--no-walk`とは組み合わせることができません。

これにより親の書き換えが有効になります。上記の「*履歴の簡素化*」を参照してください。

これはデフォルトで`--topo-order`オプションを暗黙的に指定しますが、`--date-order`オプションも指定できます。

--show-linear-break[=<barrier>]

`--graph`が使用されない場合、すべての履歴ブランチが平坦化され、連続する2つのコミットが線形ブランチに属していないことを視覚的に把握するのが難しくなることがあります。このオプションは、そのような場合にそれらの間に区切り線を入れます。``が指定された場合、それはデフォルトの文字列の代わりとして表示される文字列です。

整形形式

コミットがマージであり、整形形式が*oneline*、*email*、*raw*のいずれでもない場合、*Author:*行の前に1行追加されます。この行は「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`などの他のオプションの影響を受けません。

  • email

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

    *email*と同様ですが、コミットメッセージ内の「From 」で始まる行(0個以上の「>」が先行する)は、「>」で引用符付けされ、新しいコミットの開始と混同されないようにします。

  • raw

    *raw*形式は、コミットオブジェクトに保存されているコミット全体を正確に表示します。特に、ハッシュは`--abbrev`または`--no-abbrev`が使用されているかに関わらず完全な形式で表示され、*parents*情報は、接ぎ木や履歴の簡素化を考慮せず、真の親コミットを表示します。この形式はコミットの表示方法には影響しますが、例えば`git log --raw`での差分の表示方法には影響しないことに注意してください。raw差分形式で完全なオブジェクト名を取得するには、`--no-abbrev`を使用します。

  • format:<形式文字列>

    *format:<形式文字列>*形式を使用すると、表示したい情報を指定できます。これは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*の後に2つの16進数が続くものは、その16進数値を持つバイトに置き換えられます(これをこのドキュメントの残りの部分では「リテラル書式コード」と呼びます)。

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

      *%Cred*

      色を赤に切り替える

      *%Cgreen*

      色を緑に切り替える

      *%Cblue*

      色を青に切り替える

      *%Creset*

      色をリセットする

      *%C(…​)*

      git-config[1]の「CONFIGURATION FILE」セクションの「Values」で説明されている色の指定。デフォルトでは、色はログ出力が有効な場合のみ表示されます(`color.diff`、`color.ui`、または`--color`によって有効になり、ターミナルに出力する場合は前者で`auto`設定が尊重されます)。`%C(auto,...)`は、デフォルトの歴史的な同義語として受け入れられます(例: `%C(auto,red)`)。`%C(always,...)`を指定すると、色が他の方法で有効になっていない場合でも色が表示されます(ただし、この形式やGitが色付けする可能性のある他のすべてを含む、出力全体の色を有効にするには`--color=always`を使用することを検討してください)。`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` 文字列には、コロンとゼロ個以上のカンマ区切りのオプションが続く場合があります。オプション値にはリテラルの書式設定コードを含めることができます。これらはオプション構文における役割のため、カンマ(`%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` 文字列には、コロンとゼロ個以上のカンマ区切りのオプションが続く場合があります。タグが同時に追加または削除される場合、説明は一貫しないことがあります。

    • tags[=<bool-value>]: 注釈付きタグのみを考慮するのではなく、軽量タグも考慮します。

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

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

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

    %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/master`は`refs/heads/master@{0}`を生成します)。

    %gd

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

    %gn

    reflog ID名

    %gN

    reflog ID名(.mailmapを尊重し、git-shortlog[1]またはgit-blame[1]を参照)

    %ge

    reflog IDメール

    %gE

    reflog IDメール(.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>]`を受け入れます。`--type=bool` git-config[1]が取る値(`yes`や`off`など)はすべて受け入れられます。`=`なしでブール値オプションを指定することは、`=true`で指定することと同じです。

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

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

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

  • tformat

    tformat: フォーマットは、"separator"セマンティクスではなく"terminator"セマンティクスを提供する点を除いて、format:と全く同じように機能します。言い換えれば、各コミットにはメッセージ終端文字(通常は改行)が追加され、エントリ間に区切り文字が配置されるのではありません。これは、単一行フォーマットの最後のエントリが、「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

差分フォーマット

デフォルトでは、`git log`は差分出力を生成しません。以下のオプションは、各コミットによって行われた変更を表示するために使用できます。

いずれかの`--diff-merges`バリアント(短い`-m`、`-c`、`--cc`、`--dd`オプションを含む)が明示的に指定されていない限り、マージコミットは`--patch`のような差分フォーマットが選択されても差分を表示せず、`-S`のような検索オプションにも一致しないことに注意してください。ただし、`--first-parent`が使用されている場合は例外で、その場合`first-parent`がマージコミットのデフォルトフォーマットになります。

`--p`
`--u`
`--patch`

パッチを生成する(-pでのパッチテキスト生成を参照)。

`--s`
`--no-patch`

差分機構からのすべての出力を抑制します。git showのようにデフォルトでパッチを表示するコマンドの出力を抑制したり、エイリアスでコマンドラインの早い段階にある`--patch`、`--stat`などのオプションの効果を打ち消したりするのに役立ちます。

-m

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

-c

マージコミットに対して結合差分出力を生成します。`--diff-merges=combined -p`のショートカットです。

--cc

マージコミットに対して高密度結合差分出力を生成します。`--diff-merges=dense-combined -p`のショートカットです。

--dd

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

--remerge-diff

マージコミットに対して再マージ差分出力を生成します。`--diff-merges=remerge -p`のショートカットです。

--no-diff-merges

`--diff-merges=off`の同義語。

--diff-merges=<format>

マージコミットに使用する差分フォーマットを指定します。デフォルトは`off`ですが、`--first-parent`が使用されている場合は`first-parent`がデフォルトになります。

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

off, none

マージコミットの差分出力を無効にします。暗黙の値をオーバーライドするのに便利です。

on, m

マージコミットの差分出力をデフォルトフォーマットで表示するようにします。デフォルトフォーマットは`log.diffMerges`設定変数で変更でき、そのデフォルト値は`separate`です。

first-parent, 1

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

separate

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

combined, c

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

dense-combined, cc

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

remerge, r

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

このオプションが使用された際に出力される内容は変更される可能性があり、他のオプションとの相互作用も同様です(明示的に文書化されている場合を除く)。

--combined-all-paths

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

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

通常の3行ではなく、<n>行のコンテキストを持つ差分を生成します。`--patch`を暗黙的に指定します。

`--output=<file>`

標準出力ではなく、指定されたファイルに出力します。

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

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

`--raw`

各コミットについて、生の差分フォーマットを使用して変更の概要を表示します。git-diff[1]の「RAW OUTPUT FORMAT」セクションを参照してください。これは、`--format=raw`で実現できる、ログ自体を生フォーマットで表示することとは異なります。

`--patch-with-raw`

`-p --raw`の同義語。

`--t`

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

`--indent-heuristic`

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

`--no-indent-heuristic`

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

`--minimal`

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

`--patience`

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

`--histogram`

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

`--anchored=<text>`

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

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

ある行がソースとデスティネーションの両方に存在し、一度だけ存在し、<text>で始まる場合、このアルゴリズムはそれが出力で削除または追加として表示されるのを防ごうとします。内部的には「patience diff」アルゴリズムを使用します。

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

差分アルゴリズムを選択します。バリアントは以下の通りです

`default`
`myers`

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

`minimal`

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

`patience`

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

`histogram`

このアルゴリズムは、パティエンスアルゴリズムを「出現頻度の低い共通要素のサポート」に拡張します。

例えば、`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`を使用すると、statグラフを生成するすべてのコマンドに影響しますが、`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`

コミットを改行ではなく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`(つまり`=`なし)は`--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`になり、次のいずれかである必要があります。

`color`

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

`plain`

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

`porcelain`

スクリプトで消費することを意図した特別な行ベースのフォーマットを使用します。追加/削除/変更なしの区間は、通常の統合差分フォーマットで印刷され、行の先頭に`+`/`-`/` `文字が付き、行の最後まで続きます。入力中の改行は、それ自身の行にあるチルダ`~`で表されます。

`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>`

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

`--full-index`

パッチフォーマット出力を生成する際に、「index」行に最初の数文字の代わりに、プリイメージおよびポストイメージのBLOBオブジェクト名を完全な形式で表示します。

`--binary`

`--full-index`に加えて、git-applyで適用できるバイナリ差分を出力します。`--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`は追加されたパスと削除されたパスを除外します。

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

`-S<string>`

ファイル内で指定された<string>の出現回数を変更する差分(つまり、追加/削除)を探します。スクリプト作成者向けです。

特定のコードブロック(構造体など)を探していて、そのブロックが最初に作成されてからの履歴を知りたい場合に便利です。この機能を繰り返し使用して、プリイメージ内の関心のあるブロックを`-S`にフィードバックし、そのブロックの最初のバージョンが得られるまで続行します。

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

`-G<regex>`

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

`-S<regex>` `--pickaxe-regex`と`-G<regex>`の違いを説明するために、同じファイルに以下の差分があるコミットを考えてください。

+    return frotz(nitfol, two->ptr, 1, 0);
...
-    hit = frotz(nitfol, mf2.ptr, 1, 0);

`git log -G"frotz\(nitfol"`はこのコミットを表示しますが、`git log -S"frotz\(nitfol" --pickaxe-regex`は表示しません(その文字列の出現回数が変更されていないため)。

`--text`が指定されない限り、textconvフィルターのないバイナリファイルのパッチは無視されます。

詳細については、gitdiffcore[7]pickaxeエントリを参照してください。

`--find-object=<object-id>`

指定されたオブジェクトの出現回数を変更する差分を探します。`-S`に似ていますが、引数が異なり、特定の文字列ではなく特定のオブジェクトIDを検索します。

オブジェクトは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>`

差分ハンク間のコンテキストを指定された<number>行まで表示し、互いに近いハンクを融合させます。デフォルトは`diff.interHunkContext`、または設定オプションが未設定の場合は0です。

`-W`
`--function-context`

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

`--ext-diff`

外部差分ヘルパーの実行を許可します。gitattributes[5]で外部差分ドライバーを設定した場合、git-log[1]および関連コマンドでこのオプションを使用する必要があります。

`--no-ext-diff`

外部差分ドライバーを許可しません。

`--textconv`
`--no-textconv`

バイナリファイルを比較する際に外部テキスト変換フィルターの実行を許可(または不許可)します。詳細はgitattributes[5]を参照してください。textconvフィルターは通常一方通行の変換であるため、結果の差分は人間が読むには適していますが、適用することはできません。このため、textconvフィルターはデフォルトでgit-diff[1]git-log[1]でのみ有効になっており、git-format-patch[1]や差分プラミングコマンドでは有効になっていません。

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

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

`--src-prefix=<prefix>`

「a/」の代わりに、指定されたソースの<prefix>を表示します。

`--dst-prefix=<prefix>`

「b/」の代わりに、指定されたデスティネーションの<prefix>を表示します。

`--no-prefix`

ソースまたはデスティネーションのプレフィックスを表示しません。

`--default-prefix`

デフォルトのソースおよびデスティネーションプレフィックス(「a/」および「b/」)を使用します。これは、`diff.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`では存在しないものとしてエントリを表示させます。両方のオプションは実験的であり、将来的に削除される可能性があります。

これらの共通オプションに関する詳細な説明については、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`オプションが生成するものは、従来の差分フォーマットとはわずかに異なります。

  1. これは、次のような「git diff」ヘッダーが前に付きます。

    diff --git a/file1 b/file2

    `a/`と`b/`のファイル名は、名前変更/コピーが関与しない限り同じです。特に、作成や削除の場合でも、`/dev/null`は`a/`または`b/`のファイル名の代わりに使用されません

    名前変更/コピーが関与する場合、`file1`と`file2`はそれぞれ名前変更/コピー元のファイル名と名前変更/コピーによって生成されるファイル名を示します。

  2. これは、1つ以上の拡張ヘッダー行が続きます。

    old mode <モード> new mode <モード> deleted file mode <モード> new file mode <モード> copy from <パス> copy to <パス> rename from <パス> rename to <パス> similarity index <数値> dissimilarity index <数値> index <ハッシュ>..<ハッシュ> <モード>

    ファイルモード<mode>は、ファイルタイプとファイルパーミッションビットを含む6桁の8進数で表示されます。

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

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

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

  3. 「通常ではない」文字を含むパス名は、設定変数`core.quotePath`(git-config[1]を参照)で説明されているようにクォートされます。

  4. 出力内のすべての`file1`ファイルはコミット前のファイルを参照し、すべての`file2`ファイルはコミット後のファイルを参照します。各変更を各ファイルに順番に適用するのは誤りです。例えば、このパッチはaとbを交換します。

    diff --git a/a b/b
    rename from a
    rename to b
    diff --git a/b b/a
    rename from b
    rename to a
  5. ハンクヘッダーは、そのハンクが適用される関数の名前を示します。特定の言語に合わせてこれを調整する方法の詳細については、gitattributes[5]の「Defining a custom hunk-header」を参照してください。

結合差分フォーマット

任意の差分生成コマンドは、マージを表示する際に結合差分を生成するために`-c`または`--cc`オプションを取ることができます。これはgit-diff[1]またはgit-show[1]でマージを表示する際のデフォルトフォーマットです。また、これらのコマンドのいずれかに適切な`--diff-merges`オプションを与えて、特定のフォーマットで差分の生成を強制することもできます。

「結合差分」フォーマットは次のようになります。

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

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

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

    diff --combined file

    または、次のようなヘッダーが前に付きます(`--cc`オプションが使用された場合)。

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

    index <ハッシュ>,<ハッシュ>..<ハッシュ> mode <モード>,<モード>..<モード> new file mode <モード> deleted file mode <モード>,<モード>

    `mode <mode>,<mode>..<tree-ish>の差分で動作するように設計されており、結合差分フォーマットでは使用されません。

  3. これは、2行のfrom-file/to-fileヘッダーが続きます。

    --- a/file
    +++ b/file

    従来の統合差分フォーマットの2行ヘッダーと同様に、`/dev/null`は作成または削除されたファイルを示すために使用されます。

    しかし、`--combined-all-paths`オプションが指定されている場合、2行のfrom-file/to-fileではなく、N+1行のfrom-file/to-fileヘッダーが表示されます。ここでNはマージコミットの親の数です。

    --- a/file
    --- a/file
    --- a/file
    +++ b/file

    この拡張フォーマットは、名前変更またはコピー検出が有効な場合に、異なる親におけるファイルの元の名前を確認できるため便利です。

  4. チャンクヘッダーフォーマットは、誤って`patch -p1`に渡されるのを防ぐために変更されています。結合差分フォーマットはマージコミットの変更をレビューするために作成されたものであり、適用されることを意図していませんでした。この変更は、拡張indexヘッダーの変更に似ています。

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

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

従来の統合差分フォーマットが、単一の列に`-`(マイナス — AにはあるがBでは削除)、`+`(プラス — AにはないがBに追加)、または` `(スペース — 変更なし)のプレフィックスを持つ2つのファイルAとBを表示するのとは異なり、このフォーマットは2つ以上のファイルfile1, file2,…​ を1つのファイルXと比較し、Xが各fileNとどのように異なるかを示します。各fileNについて1つの列が、Xの行がそれとどのように異なるかを記すために出力行の前に付加されます。

列Nの`-`文字は、その行がfileNには存在するが結果には存在しないことを意味します。列Nの`+`文字は、その行が結果には存在するがfileNにはその行がないことを意味します(言い換えれば、その親の視点から見ると、その行が追加されたことになります)。

上記の出力例では、関数シグネチャが両方のファイルから変更されました(そのため、file1とfile2の両方から2つの`-`削除があり、さらに`++`は追加された1行がfile1とfile2のどちらにも存在しないことを意味します)。また、他の8行はfile1と同じですがfile2には存在しません(そのため`+`が前置されています)。

`git diff-tree -c`で表示される場合、マージコミットの親とマージ結果を比較します(つまり、file1..fileNが親です)。`git diff-files -c`で表示される場合、未解決のマージ親2つと作業ツリーファイルを比較します(つまり、file1はステージ2、別名「our version」、file2はステージ3、別名「their version」です)。

`git log --no-merges`

コミット履歴全体を表示しますが、マージはスキップします。

`git log v2.6.12.. include/scsi drivers/scsi`

バージョンv2.6.12以降で、`include/scsi`または`drivers/scsi`サブディレクトリ内のファイルを変更したすべてのコミットを表示します。

`git log --since="2 weeks ago" -- gitk`

過去2週間のファイルgitkへの変更を表示します。`--`は、gitkという名前の**ブランチ**との混同を避けるために必要です。

`git log --name-status release..test`

「test」ブランチには存在するが「release」ブランチにはまだ存在しないコミットを、各コミットが変更するパスのリストとともに表示します。

`git log --follow builtin/rev-list.c`

`builtin/rev-list.c`を変更したコミットを表示します。これには、ファイルが現在の名前になる前に発生したコミットも含まれます。

`git log --branches --not --remotes=origin`

ローカルブランチのいずれかには存在するが、originの追跡対象リモートブランチのいずれかには存在しないすべてのコミットを表示します(originが持っていない、あなたが持っているもの)。

`git log master --not --remotes=*/master`

ローカルのマスターブランチには存在するが、リモートリポジトリのどのマスターブランチにも存在しないすべてのコミットを表示します。

`git log -p -m --first-parent`

変更差分を含む履歴を表示しますが、「メインブランチ」の視点からのみ表示し、マージされたブランチからのコミットはスキップし、マージによって導入された変更の完全な差分を表示します。これは、単一の統合ブランチに留まりながらすべてのトピックブランチをマージするという厳格なポリシーに従っている場合にのみ意味があります。

`git log -L '/int main/',/^}/:main.c`

ファイル`main.c`内の`main()`関数が時間の経過とともにどのように変化したかを表示します。

`git log -3`

表示するコミット数を3に制限します。

議論

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

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

  • パス名はUTF-8正規化形式Cでエンコードされます。これは、ツリーオブジェクト、インデックスファイル、参照名、およびコマンドライン引数、環境変数、設定ファイル(`.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

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

  2. git loggit showgit blameおよび関連コマンドは、コミットオブジェクトの`encoding`ヘッダーを参照し、特に指定がない限り、ログメッセージをUTF-8に再エンコードしようとします。目的の出力エンコーディングは、`.git/config`ファイルに`i18n.logOutputEncoding`を次のように設定することで指定できます。

    [i18n]
    	logOutputEncoding = ISO-8859-1

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

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

設定

コア変数についてはgit-config[1]を、差分生成に関する設定についてはgit-diff[1]を参照してください。

format.pretty

`--format`オプションのデフォルト。(上記のPretty Formatsを参照。)デフォルトは`medium`です。

i18n.logOutputEncoding

ログ表示時に使用するエンコーディング。(上記のDiscussionを参照。)設定されている場合は`i18n.commitEncoding`の値がデフォルトとなり、それ以外の場合はUTF-8です。

このセクションのこの行より上の内容は、git-config[1]のドキュメントには含まれていません。これ以降のコンテンツは、そちらで見つかるものと同じです。

log.abbrevCommit

trueの場合、git-log[1]git-show[1]、およびgit-whatchanged[1]が`--abbrev-commit`を仮定するようにします。このオプションは`--no-abbrev-commit`で上書きできます。

log.date

logコマンドのデフォルトの日時モードを設定します。log.dateに値を設定することは、git logの`--date`オプションを使用することに似ています。git-log[1]で詳細を参照してください。

フォーマットが「auto:foo」に設定されており、ページャが使用されている場合、日付フォーマットには「foo」が使用されます。それ以外の場合は、「default」が使用されます。

log.decorate

ログコマンドによって表示されるコミットの参照名を出力します。shortが指定された場合、参照名プレフィックスrefs/heads/refs/tags/refs/remotes/は印刷されません。fullが指定された場合、完全な参照名(プレフィックスを含む)が印刷されます。autoが指定された場合、出力がターミナルに向かっている場合はshortが与えられたかのように参照名が表示され、それ以外の場合は参照名は表示されません。これは`git log`の`--decorate`オプションと同じです。

log.initialDecorationSet

デフォルトでは、git logは特定の既知のリファレンス名前空間のデコレーションのみを表示します。allを指定すると、すべてのリファレンスがデコレーションとして表示されます。

log.excludeDecoration

ログのデコレーションから指定されたパターンを除外します。これは--decorate-refs-excludeコマンドラインオプションに似ていますが、設定オプションは--decorate-refsオプションによって上書きされる可能性があります。

log.diffMerges

--diff-merges=onが指定されたときに使用されるdiffフォーマットを設定します。詳細はgit-log[1]--diff-mergesを参照してください。デフォルトはseparateです。

log.follow

trueの場合、単一の<path>が与えられたときにgit log--followオプションが使用されたかのように動作します。これは--followと同じ制限があります。つまり、複数のファイルを追跡するために使用できず、非線形履歴ではうまく機能しません。

log.graphColors

git log --graphで履歴線を描画するために使用できる、コンマで区切られた色のリスト。

log.showRoot

trueの場合、最初のコミットは大きな作成イベントとして表示されます。これは空のツリーとのdiffに相当します。git-log[1]git-whatchanged[1]などの通常ルートコミットを非表示にするツールも、これからは表示するようになります。デフォルトはtrueです。

log.showSignature

trueの場合、git-log[1]git-show[1]、およびgit-whatchanged[1]--show-signatureを想定するようにします。

log.mailmap

trueの場合、git-log[1]git-show[1]、およびgit-whatchanged[1]--use-mailmapを想定し、そうでない場合は--no-use-mailmapを想定します。デフォルトはtrueです。

notes.mergeStrategy

ノートの競合を解決する際に、デフォルトでどのマージ戦略を選択するか。manualourstheirsunion、またはcat_sort_uniqのいずれかである必要があります。デフォルトはmanualです。各戦略の詳細については、git-notes[1]の「NOTES MERGE STRATEGIES」セクションを参照してください。

この設定は、git-notes[1]--strategyオプションを渡すことで上書きできます。

notes.<name>.mergeStrategy

refs/notes/<name>にノートのマージを行う際に、どのマージ戦略を選択するか。これはより一般的なnotes.mergeStrategyを上書きします。利用可能な戦略の詳細については、git-notes[1]の「NOTES MERGE STRATEGIES」セクションを参照してください。

notes.displayRef

git log系のコマンドでコミットメッセージを表示する際に、core.notesRefまたはGIT_NOTES_REFで設定されたデフォルトのセットに加えて、どのリファレンス(グロブまたは複数回指定された場合は複数のリファレンス)からノートを読み込むか。

この設定は、コロンで区切られたリファレンスまたはグロブのリストであるGIT_NOTES_DISPLAY_REF環境変数によって上書きできます。

存在しないリファレンスに対しては警告が発行されますが、どのリファレンスにも一致しないグロブは黙って無視されます。

この設定は、git-log[1]系のコマンドに対する--no-notesオプション、またはこれらのコマンドで受け入れられる--notes=<ref>オプションによって無効にできます。

core.notesRefの実効値(GIT_NOTES_REFによって上書きされている可能性あり)も、表示されるリファレンスのリストに暗黙的に追加されます。

notes.rewrite.<command>

<command>(現在のところamendまたはrebase)でコミットを書き換える際、この変数がfalseの場合、gitは元のコミットから書き換えられたコミットへノートをコピーしません。デフォルトはtrueです。以下のnotes.rewriteRefも参照してください。

この設定は、コロンで区切られたリファレンスまたはグロブのリストであるGIT_NOTES_REWRITE_REF環境変数によって上書きできます。

notes.rewriteMode

書き換え中にノートをコピーする際(notes.rewrite.<command>オプションを参照)、ターゲットコミットにすでにノートがある場合にどうするかを決定します。overwriteconcatenatecat_sort_uniq、またはignoreのいずれかである必要があります。デフォルトはconcatenateです。

この設定は、GIT_NOTES_REWRITE_MODE環境変数によって上書きできます。

notes.rewriteRef

書き換え中にノートをコピーする際、ノートがコピーされるべき(完全に修飾された)リファレンスを指定します。グロブである場合もあり、その場合は一致するすべてのリファレンスのノートがコピーされます。この設定を複数回指定することもできます。

デフォルト値はありません。ノートの書き換えを有効にするには、この変数を設定する必要があります。デフォルトのコミットノートの書き換えを有効にするには、refs/notes/commitsに設定します。

GIT_NOTES_REWRITE_REF環境変数によって上書きできます。そのフォーマットの詳細については、上記のnotes.rewrite.<command>を参照してください。

GIT

git[1]スイートの一部

scroll-to-top