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

名前

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

概要

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

説明

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

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

これは集合演算と考えることができます。コマンドラインで指定されたコミットから到達可能なコミットは集合を形成し、その後、先頭に`^`が付いたコミットから到達可能なコミットはその集合から差し引かれます。残りのコミットがコマンドの出力として表示されます。結果をさらに絞り込むために、さまざまなオプションやパスパラメーターを使用できます。

したがって、次のコマンド

$ git log foo bar ^baz

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

特別な表記「`<commit1>`..`<commit2>`」は「`^<commit1> <commit2>`」の省略形として使用できます。例えば、次のいずれかを使用できます。

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

もう一つの特別な表記は「`<commit1>`…`<commit2>`」で、マージに役立ちます。結果のコミット集合は、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 <path>...`は指定されたパスに影響を与えるコミットと、同じ指定されたパスに関する差分を表示します。これを使用すると、指定されたパスに影響を与えるコミットの完全な差分が表示されます。つまり、「<path>…​」はコミットのみを制限し、これらのコミットの差分を制限しません。

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

--log-size

各コミットの出力に「ログサイズ <number>」という行を含めます。ここで、<number>はそのコミットのメッセージの長さ(バイト単位)です。事前にスペースを割り当てることで、`git log`出力からログメッセージを読み取るツールの速度を向上させることを目的としています。

-L<start>,<end>:<file>
-L:<funcname>:<file>

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

`<start>`と`<end>`は次のいずれかの形式を取ることができます。

  • 数値

    `<start>`または`<end>`が数値の場合、絶対行数を指定します(行は1からカウントされます)。

  • /正規表現/

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

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

    これは`<end>`に対してのみ有効であり、`<start>`で指定された行の前後にある行数を指定します。

`<start>`と`<end>`の代わりに`:<funcname>`が指定されている場合、`<funcname>`に一致する最初の`funcname`行から次の`funcname`行までの範囲を示す正規表現です。`:<funcname>`は、前の`-L`範囲の終わりから検索します(存在する場合)。存在しない場合はファイルの先頭から検索します。`^:<funcname>`はファイルの先頭から検索します。関数名は、gitattributes[5]の(`Defining a custom hunk-header`を参照)`git diff`がパッチのチャンクヘッダーをどのように処理するかと同じ方法で決定されます。

<revision-range>

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

[--] <path>…​

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

オプションやリビジョン範囲と区別するために、パスに`--`をプレフィックスとして付ける必要がある場合があります。

コミットの制限

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

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

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

-<number>
-n <number>
--max-count=<number>

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

--skip=<number>

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

--since=<date>
--after=<date>

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

--since-as-filter=<date>

特定の日付より新しいすべてのコミットを表示します。特定の日付より古い最初のコミットで停止するのではなく、範囲内のすべてのコミットを処理します。

--until=<date>
--before=<date>

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

--author=<pattern>
--committer=<pattern>

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

--grep-reflog=<pattern>

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

--grep=<pattern>

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

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

--all-match

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

--invert-grep

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

-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

親コミットが2つ以上あるコミットを出力しません。これは--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

含めるコミットを検索する際に、マージコミットが表示されたら、最初の親コミットのみをフォローします。このオプションは、特定のトピックブランチの進化を表示する場合に、より良い概要を提供できます。トピックブランチへのマージは、時々更新された上流に適応することだけである傾向があり、このオプションを使用すると、そのようなマージによって履歴にもたらされた個々のコミットを無視できます。

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

--exclude-first-parent-only

除外するコミット(^付き)を検索する際に、マージコミットが表示されたら、最初の親コミットのみをフォローします。これは、任意のマージが有効なトピックブランチの変更となる場合、リモートブランチから分岐した時点からのトピックブランチの変更セットを見つけるために使用できます。

--not

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

--all

refs/内のすべてのrefとHEADが、コマンドラインに<commit>としてリストされているかのように振る舞います。

--branches[=<pattern>]

refs/heads内のすべてのrefが、コマンドラインに<commit>としてリストされているかのように振る舞います。<pattern>が指定されている場合、指定されたシェルglobと一致するブランチに制限します。パターンに?*、または[がない場合、最後に/*が暗黙的に追加されます。

--tags[=<pattern>]

refs/tags内のすべてのrefが、コマンドラインに<commit>としてリストされているかのように振る舞います。<pattern>が指定されている場合、指定されたシェルglobと一致するタグに制限します。パターンに?*、または[がない場合、最後に/*が暗黙的に追加されます。

--remotes[=<pattern>]

refs/remotes内のすべてのrefが、コマンドラインに<commit>としてリストされているかのように振る舞います。<pattern>が指定されている場合、指定されたシェルglobと一致するリモート追跡ブランチに制限します。パターンに?*、または[がない場合、最後に/*が暗黙的に追加されます。

--glob=<glob-pattern>

シェルglob <glob-pattern>と一致するすべてのrefが、コマンドラインに<commit>としてリストされているかのように振る舞います。先頭のrefs/は、存在しない場合に自動的に追加されます。パターンに?*、または[がない場合、最後に/*が暗黙的に追加されます。

--exclude=<glob-pattern>

次の--all--branches--tags--remotes、または--globが考慮するrefのうち、<glob-pattern>と一致するrefを含めません。このオプションの繰り返しは、次の--all--branches--tags--remotes、または--globオプションまで除外パターンを蓄積します(他のオプションまたは引数は蓄積されたパターンをクリアしません)。

指定されたパターンは、それぞれ--branches--tags、または--remotesに適用される場合、refs/headsrefs/tags、またはrefs/remotesで始まるべきではなく、--globまたは--allに適用される場合はrefs/で始まる必要があります。末尾の/*を意図している場合は、明示的に指定する必要があります。

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

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

--reflog

reflogによって参照されるすべてのオブジェクトが、コマンドラインに<commit>としてリストされているかのように振る舞います。

--alternate-refs

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

--single-worktree

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

--ignore-missing

入力に無効なオブジェクト名が表示された場合、不正な入力が与えられていないかのように振る舞います。

--bisect

不正なバイセクションref refs/bisect/badがリストされているかのように、そしてそれがコマンドラインで--notと良好なバイセクションref refs/bisect/good-*に続いて使用されているかのように振る舞います。

--stdin

コマンドラインから引数を取得することに加えて、標準入力からも引数を取得します。これは、--all--glob=などのコミットと擬似オプションを受け入れます。--セパレータが表示されると、後続の入力はパスとして扱われ、結果を制限するために使用されます。標準入力から読み取られる--notなどのフラグは、同じ方法で渡された引数に対してのみ尊重され、後続のコマンドライン引数には影響しません。

--cherry-mark

--cherry-pick(下記参照)に似ていますが、同等のコミットを=でマークする代わりに省略し、同等でないコミットを+でマークします。

--cherry-pick

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

例えば、ブランチABの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 log --cherry upstream...mybranchを使用してマークするのに役立ちます。これはgit cherry upstream mybranchと似ています。

-g
--walk-reflogs

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

--prettyフォーマットでonelinereference以外を使用する場合(明らかな理由から)、出力にはreflogから取得された2行の情報が追加されます。出力のreflog指定子は、いくつかのルールに応じてref@{<Nth>}(ここで<Nth>はreflogにおける逆時間順のインデックス)またはref@{<timestamp>}(そのエントリの<timestamp>付き)として表示される場合があります。

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

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

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

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

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

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

--merge

HEAD...<other>の範囲内で競合するパスに影響を与えるコミットを表示します。ここで<other>MERGE_HEADCHERRY_PICK_HEADREVERT_HEAD、またはREBASE_HEAD内の最初の既存の擬似参照です。インデックスにマージされていないエントリがある場合にのみ機能します。このオプションは、3方向マージからの競合を解決するときに関連するコミットを表示するために使用できます。

--boundary

除外された境界コミットを出力します。境界コミットには-がプレフィックスとして付けられます。

履歴の単純化

場合によっては、履歴の一部、例えば特定の<path>を変更するコミットだけに興味がある場合があります。しかし、「履歴の単純化」には2つの部分があります。1つはコミットの選択、もう1つは方法です。履歴を単純化する方法は様々です。

次のオプションは、表示するコミットを選択します。

<paths>

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

--simplify-by-decoration

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

意味のある履歴を得るために、追加のコミットが表示される場合があります。

次のオプションは、単純化の実行方法に影響します。

デフォルトモード

ツリーの最終状態を説明する最も単純な履歴に履歴を単純化します。最終結果が同じ場合(つまり、同じコンテンツを持つブランチのマージ)、いくつかの枝を削除するため、最も単純です。

--show-pulls

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

--full-history

デフォルトモードと同じですが、履歴を削除しません。

--dense

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

--sparse

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

--simplify-merges

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

--ancestry-path[=<commit>]

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

より詳細な説明は次のとおりです。

<paths>としてfooを指定したとします。fooを変更するコミットを!TREESAME、それ以外のコミットをTREESAMEと呼びます。(fooでフィルタリングされたdiffでは、それぞれ異なって見えますが、等しくなります。)

以下では、単純化設定の違いを示すために、常に同じ例の履歴を参照します。このコミットグラフでファイル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」のみを含みます。

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

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

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

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

  • Xは新しいファイルsideを追加した独立したルートコミットであり、Yはそれを変更しました。YXとTREESAMEです。そのマージQsidePに追加し、QPとTREESAMEですが、YとはTREESAMEではありません。

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

デフォルトモード

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

結果は次のようになります。

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

TREESAMEの親がある場合にその親のみをたどるというルールによって、Bが完全に考慮から除外されたことに注意してください。CN経由で考慮されましたが、TREESAMEです。ルートコミットは空のツリーと比較されるため、Iは!TREESAMEです。

親/子の関係は--parentsでしか表示できませんが、デフォルトモードで選択されたコミットには影響しません。そのため、親の行を示しました。

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

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

	I  A  B  N  D  O  P  Q

Mは両方の親とTREESAMEであるため除外されました。ECBはすべてたどられましたが、Bのみが!TREESAMEであったため、他のものは表示されません。

親の書き換えがない場合、コミット間の親/子の関係について話すことは実際には不可能であるため、それらを接続されていない状態で表示します。

親の書き換えによる--full-history

通常のコミットは、!TREESAMEでない場合にのみ含まれます(ただし、これは変更できます。以下の--sparseを参照)。

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

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

上記の親の書き換えなしの--full-historyと比較してください。EはTREESAMEであるため削除されましたが、Pの親リストはEの親Iを含むように書き換えられました。CN、およびXYQでも同じことが行われました。

上記の設定に加えて、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に対するNPQの大きな違いに注意してください。

  • Nの親リストからIが削除されました。これは他の親Mの祖先であるためです。それでも、Nは!TREESAMEであるため残りました。

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

  • Q の親リストでは YX に簡略化されました。X は TREESAME ルートであったため、削除されました。その後、Q は親が1つだけで TREESAME であったため、完全に削除されました。

別の簡略化モードが利用可能です。

--ancestry-path[=<commit>]

<commit> の祖先であるコミット、<commit> の子孫であるコミット、または <commit> 自身のコミットに表示されるコミットを制限します。

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

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

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

しかし、M のどのコミットが D によって導入されたバグに汚染されており、修正が必要なのかを調べたい場合、CK を除外する、つまり D..M のうち D の子孫であるサブセットのみを表示したい場合があります。これが --ancestry-path オプションが実際に行うことです。D..M 範囲に適用すると、次のようになります。

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

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

代わりに、この範囲内の特定のトピックと、そのトピックの影響を受けたすべてのコミットに関心がある場合、そのトピックを祖先パスに含む 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--'

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

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

	I---X

--full-history を使用すると、Git はすべてエッジを辿ります。これにより、コミット AB、そしてマージ M が検出されますが、マージコミット OP も表示されます。親の書き換えにより、結果として得られるグラフは次のようになります。

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

ここでは、マージコミット OP は実際には file.txt に変更を加えていないため、余計なノイズをもたらします。それらは、古いバージョンの file.txt をベースにしたトピックをマージしただけです。これは、多くの貢献者が並行して作業し、単一のトランクに沿ってトピックブランチをマージするワークフローを使用するリポジトリでよくある問題です。多くの無関係なマージが --full-history の結果に表示されます。

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

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

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

最初の問題はパフォーマンスです。以前のオプションとは異なり、--simplify-merges オプションは、単一の結果を返す前にコミット履歴全体を辿る必要があります。これにより、非常に大きなリポジトリではオプションが使いにくくなる可能性があります。

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

--show-pulls

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

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

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

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

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

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

MR から到達可能であるため、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---

数字はコミットタイムスタンプの順序を示しており、--date-order を使用した git rev-list などでは、コミットはタイムスタンプの順序で表示されます: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>

指定されたフォーマットでコミットログの内容をきれいに表示します。ここで、<format>onelineshortmediumfullfullerreferenceemailrawformat:<string>tformat:<string> のいずれかです。<format> が上記のいずれでもなく、%placeholder を含む場合、--pretty=tformat:<format> が指定されたかのように動作します。

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

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

--abbrev-commit

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

これにより、80桁の端末を使用しているユーザーにとって、"--pretty=oneline"がはるかに読みやすくなります。

--no-abbrev-commit

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

--oneline

これは、一緒に使用される"--pretty=oneline --abbrev-commit"の省略形です。

--encoding=<encoding>

コミットオブジェクトは、ログメッセージに使用される文字エンコーディングをエンコーディングヘッダーに記録します。このオプションを使用して、コマンドにコミットログメッセージをユーザーが優先するエンコーディングで再コード化させることができます。非 plumbing コマンドでは、デフォルトは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スペースでインデントするpretty形式(つまり、デフォルトのmediumfullfuller)でタブが展開されます。

--notes[=<ref>]

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

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

オプションの<ref>引数を使用すると、参照を使用して表示するノートを検索します。参照は、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設定変数は、ログコマンドの--dateオプションのデフォルト値を設定します。デフォルトでは、日付は元のタイムゾーン(コミッターまたは作成者のいずれか)で表示されます。-localが形式に追加されている場合(例:iso-local)、代わりにユーザーのローカルタイムゾーンが使用されます。

--date=relativeは、現在時刻を基準とした日付を表示します(例:「2時間前」)。-localオプションは--date=relativeには影響しません。

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

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

  • 日付/時刻デリミタとしてスペースを使用する。

  • 時刻とタイムゾーンの間にスペースがある。

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

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

--date=rfc(または--date=rfc2822)は、電子メールメッセージによくあるRFC 2822形式でタイムスタンプを表示します。

--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桁の年、およびタイムゾーン情報(ローカルタイムゾーンを使用する場合を除く)を1行で表示します。例: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つの連続するコミットが線形ブランチに属していないことが分かりにくくなる場合があります。このオプションは、その場合にそれらの間にバリアを配置します。<barrier>が指定されている場合、デフォルトのものとは異なる文字列が表示されます。

PRETTY FORMATS

コミットがマージされており、pretty形式がonelineemail、または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などの他のオプションの影響を受けません。

  • 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情報は、グラフトまたは履歴の単純化を考慮せずに、実際の親コミットを表示します。この形式はコミットの表示方法に影響しますが、diffの表示方法(例:git log --raw)には影響しません。raw diff形式で完全なオブジェクト名を取得するには、--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 の後に続く2つの16進数は、その16進数の値を持つバイトに置き換えられます(このドキュメントの残りの部分ではこれを「リテラル書式コード」と呼びます)。

    • 後のプレースホルダーの書式に影響を与えるプレースホルダー

      %Cred

      色を赤に変更します

      %Cgreen

      色を緑に変更します

      %Cblue

      色を青に変更します

      %Creset

      色をリセットします

      %C(…​)

      色の指定。「CONFIGURATION FILE」セクションのgit-config[1]の「Values」で説明されているとおりです。デフォルトでは、ログ出力に対して有効になっている場合にのみ色が表示されます(color.diffcolor.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文字列の後にコロンと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/master` は `refs/heads/master@{0}` を生成します)。

    %gd

    短縮された reflog セレクタ。`%gD` と同じですが、refname の部分は人間の可読性のために短縮されます(そのため、`refs/heads/master` は `master` になります)。

    %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` 文字列の後にコロンと、0 個以上のコンマ区切りのオプションを付けることができます。オプションが複数回指定されている場合、最後の出現が優先されます。

    • 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` がまだ提供されていない場合、「短い」装飾形式を使用します。

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

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

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

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

  • tformat

    tformat: 形式は format: とまったく同じように機能しますが、「セパレータ」セマンティクスではなく「ターミネータ」セマンティクスを提供します。つまり、各コミットには、エントリ間にセパレータを配置するのではなく、メッセージのターミネータ文字(通常は改行)が追加されます。これは、1 行形式の最後のエントリが「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 と似ていますが、`-m` は `-p` も指定されていない限り出力しません。

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

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

以下の形式がサポートされています。

off, none

マージコミットの差分の出力を無効にします。暗黙の値を上書きするのに役立ちます。

on, m

マージコミットの差分出力をデフォルト形式で表示します。デフォルト形式は `log.diffMerges` 構成変数を使用して変更でき、デフォルト値は `separate` です。

first-parent, 1

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

separate

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

combined, c

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

dense-combined, cc

`--diff-merges=combined` で生成された出力をさらに圧縮します。親のコンテンツに 2 つのバリアントしかなく、マージ結果がそれらのいずれかを選択して変更せずに選択した場合、面白くないハンクを省略します。

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

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

--patch-with-raw

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

-t

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

--indent-heuristic

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

--no-indent-heuristic

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

--minimal

最小限の差分が生成されるように追加の時間を費やします。

--patience

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

--histogram

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

--anchored=<text>

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

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

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

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

差分アルゴリズムを選択します。バリアントは次のとおりです。

default, myers

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

minimal

最小限の差分が生成されるように追加の時間を費やします。

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 を使用すると、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")などの拡張ヘッダー情報の要約を出力します。この情報は、ファイル名部分とグラフ部分の間に配置されます。--stat を意味します。

--numstat

--stat と似ていますが、追加および削除された行数を10進表記で表示し、パス名を省略せずに表示することで、マシンフレンドリーにします。バイナリファイルの場合は、0 0 と言う代わりに 2 つの - を出力します。

--shortstat

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

-X[<param1,param2,…​>]
--dirstat[=<param1,param2,…​>]

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

changes

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

lines

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

files

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

cumulative

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

<limit>

整数パラメータは、カットオフパーセンテージを指定します(デフォルトは 3%)。このパーセンテージ未満の変更に寄与するディレクトリは、出力に表示されません。

例:次のコマンドは、変更されたファイルをカウントし、変更されたファイルの総量の 10% 未満のディレクトリを無視し、子ディレクトリの数を親ディレクトリに累積します:--dirstat=files,10,cumulative

--cumulative

--dirstat=cumulative の同義語です。

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

--color[=<when>]

カラー付きの diff を表示します。--color(つまり、=<when>なし)は --color=always と同じです。<when>alwaysneverauto のいずれかになります。

--no-color

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

--color-moved[=<mode>]

移動されたコード行が異なる色で表示されます。オプションが指定されていない場合は <mode> のデフォルトは no、モードなしでオプションが指定されている場合は zebra になります。モードは、以下のいずれかである必要があります。

no

移動された行は強調表示されません。

default

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

plain

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

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> を使用して、単語の diff を表示します。デフォルトでは、単語は空白で区切られます。以下の --word-diff-regex を参照してください。<mode> のデフォルトは plain であり、以下のいずれかである必要があります。

color

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

plain

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

porcelain

スクリプトで使用するための特別な行ベースの形式を使用します。追加/削除/変更されていない実行は、通常の一元化された diff 形式で出力され、行の先頭に +/-/` ` 文字で始まり、行の最後まで続きます。入力の改行文字は、独自の行にチルダ ~ として表示されます。

none

単語 diff を無効にします。

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

--word-diff-regex=<regex>

空白以外の文字列を単語とみなす代わりに、<regex>を使用して単語を決定します。また、--word-diffが既に有効になっていない限り、--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>桁の最短プレフィックスを表示します。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>]

diffを生成する場合、各コミットの名前変更を検出して報告します。履歴をたどる際に名前変更を通してファイルをフォローするには、--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>の違いを説明するために、同じファイルに次のdiffを含むコミットを検討してください。

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

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

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

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

--find-object=<object-id>

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

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

--pickaxe-all

-Sまたは-Gが変更を見つけると、<string>に変更が含まれるファイルだけでなく、その変更セットのすべての変更が表示されます。

--pickaxe-regex

-Sに与えられた<string>を一致させる拡張POSIX正規表現として扱います。

-O<orderfile>

出力にファイルが表示される順序を制御します。これはdiff.orderFile設定変数を上書きします(git-config[1]を参照)。diff.orderFileをキャンセルするには、-O/dev/nullを使用します。

出力順序は、<orderfile>内のglobパターンの順序によって決まります。最初のパターンに一致するパス名を持つすべてのファイルが最初に出力され、2番目のパターン(ただし最初のパターンではない)に一致するパス名を持つすべてのファイルが次に出力され、以下同様に続きます。どのパターンにも一致しないパス名を持つすべてのファイルは、ファイルの最後に暗黙的な一致するすべてのパターンがあるかのように最後に出力されます。複数のパス名が同じランクを持つ場合(同じパターンに一致するが、以前のパターンには一致しない)、それらの相互間の出力順序は通常の順序です。

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

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

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

  • その他すべての行には、1つのパターンが含まれています。

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

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

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

-R

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

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

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

-a
--text

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

--ignore-cr-at-eol

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

--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.interHunkContextであり、設定オプションが設定されていない場合は0です。

-W
--function-context

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

--ext-diff

gitattributes[5]で外部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 plumbingコマンドに対しては有効になっていません。

--ignore-submodules[=<when>]

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

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

出力の各行の先頭に追加のプレフィックスを追加します。

--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 オプションによって生成される出力は、従来の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進数で出力されます。

    拡張ヘッダーのパス名には、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]の「カスタムチャンクヘッダーの定義」を参照してください。

結合diff形式

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

「結合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で使用するために設計されており、結合diff形式では使用されません。

  3. その後に、2行のfrom-file/to-fileヘッダーが続きます。

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

    従来の統合diff形式の2行ヘッダーと同様に、/dev/nullは作成または削除されたファイルを信号します。

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

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

    この拡張形式は、名前変更またはコピーの検出がアクティブな場合に、異なる親におけるファイルの元の名前を確認するために役立ちます。

  4. チャンクヘッダー形式は、誤ってpatch -p1にフィードすることを防ぐために変更されています。結合diff形式は、マージコミットの変更を確認するために作成されたものであり、適用することを意図したものではありません。この変更は、拡張されたindexヘッダーの変更と同様です。

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

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

従来の統合diff形式(ファイルAとファイルBを、-(マイナス — Aには存在するがBでは削除された)、+(プラス — Aには存在せずBに追加された)、" "(スペース — 変更なし)のプレフィックスが付いた単一列で表示する形式)とは異なり、この形式は、file1、file2…などの複数のファイルをファイルXと比較し、Xが各fileNとどのように異なるかを表します。fileNのそれぞれに対応する列が、出力行の先頭に付加され、Xの行がfileNとどのように異なるかが示されます。

列Nに-文字がある場合、その行はfileNには存在するが、結果には存在しません。列Nに+文字がある場合、その行は結果には存在するが、fileNには存在しません(つまり、その親の観点からは、行が追加されたことを意味します)。

上記の出力例では、関数シグネチャが両方のファイルから変更されました(したがって、file1とfile2の両方から2つの-が削除され、++は追加された行がfile1とfile2のどちらにも存在しないことを意味します)。また、他の8行はfile1と同じですが、file2には存在しません(したがって、+がプレフィックスとして付けられています)。

git diff-tree -cで表示された場合、マージコミットの親とマージ結果を比較します(つまり、file1..fileNは親です)。git diff-files -cで表示された場合、解決されていない2つのマージ親と作業ツリーのファイルを比較します(つまり、file1はステージ2(別名「私たちのバージョン」)、file2はステージ3(別名「彼らのバージョン」)です)。

git 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

ローカルのmasterブランチにはあるが、リモートリポジトリのmasterブランチのいずれにもないすべてのコミットを表示します。

git log -p -m --first-parent

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

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

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

git log -3

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

解説

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

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

  • パス名はUTF-8正規化形式Cでエンコードされます。これは、ツリーオブジェクト、インデックスファイル、ref名、コマンドライン引数、環境変数、設定ファイル(.git/configgit-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 commitgit commit-treeは、渡されたコミットログメッセージが有効なUTF-8文字列のように見えない場合に警告を発行します。これを指定するには、.git/configファイルにi18n.commitEncodingを設定します。

    [i18n]
    	commitEncoding = ISO-8859-1

    上記の構成で作成されたコミットオブジェクトは、encodingヘッダーにi18n.commitEncodingの値を記録します。これは、後でそれを見る他のユーザーを助けるためです。このヘッダーがない場合、コミットログメッセージは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]、diff生成関連の設定についてはgit-diff[1]を参照してください。

format.pretty

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

i18n.logOutputEncoding

ログを表示するときに使用するエンコーディング。(上記の「解説」を参照)。設定されている場合は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

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

log.initialDecorationSet

デフォルトでは、git logは特定の既知のref名前空間の装飾のみを表示します。allが指定されている場合、すべてのrefを装飾として表示します。

log.excludeDecoration

指定されたパターンをログの装飾から除外します。これはコマンドラインオプションの--decorate-refs-excludeに似ていますが、configオプションは--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

ノートの競合を解決するときにデフォルトで選択するマージ戦略。manualourstheirsunioncat_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で設定されたデフォルトに加えて、どの参照(globまたは複数回指定されている場合は複数の参照)からノートを読み込むか。

この設定は、GIT_NOTES_DISPLAY_REF環境変数で上書きできます。この変数は、コロンで区切られた参照またはglobのリストである必要があります。

存在しない参照については警告が表示されますが、一致する参照がないglobは黙って無視されます。

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

"core.notesRef"の有効値(GIT_NOTES_REFによって上書きされる可能性があります)も、表示される参照のリストに暗黙的に追加されます。

notes.rewrite.<command>

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

この設定は、GIT_NOTES_REWRITE_REF環境変数で上書きできます。この変数は、コロンで区切られた参照またはglobのリストである必要があります。

notes.rewriteMode

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

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

notes.rewriteRef

書き換え中にノートをコピーする際、コピーするノートの(完全修飾された)参照を指定します。globを指定することもでき、その場合は一致するすべての参照のノートがコピーされます。この設定を複数回指定することもできます。

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

GIT_NOTES_REWRITE_REF環境変数で上書きできます。形式の詳細については、上記のnotes.rewrite.<command>を参照してください。

GIT

git[1] スイートの一部

scroll-to-top