日本語 ▾ トピック ▾ 最新バージョン ▾ git-log は 2.50.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

もう1つの特殊な表記は、マージに役立つ「<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 の一致をオーバーライドします。

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

--clear-decorations

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

--source

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

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

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

--full-diff

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

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

--log-size

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

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

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

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

  • number

    <start> または <end> が数字の場合、それは絶対行番号 (行は1から数えられます) を指定します。

  • /regex/

    この形式は、与えられた POSIX 正規表現に一致する最初の行を使用します。<start> が正規表現の場合、前の -L 範囲があればその末尾から、なければファイルの先頭から検索します。<start>^/regex/ の場合、ファイルの先頭から検索します。<end> が正規表現の場合、<start> で与えられた行から検索を開始します。

  • +offset or -offset

    これは <end> にのみ有効で、<start> で与えられた行の前または後の行数を指定します。

<start><end> の代わりに :<funcname> が与えられた場合、それは <funcname> に一致する最初の funcname 行から次の funcname 行までの範囲を示す正規表現です。:<funcname> は、前の -L 範囲があればその末尾から、なければファイルの先頭から検索します。^:<funcname> はファイルの先頭から検索します。関数名は、git diff がパッチのハunkヘッダーを決定する方法と同じ方法で決定されます (gitattributes[5] の「Defining a custom hunk-header」を参照)。

<revision-range>

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

[--] <path>…​

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

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

コミットの制限

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

特に明記されていない限り、より多くのオプションを使用すると、通常、出力はさらに制限されます (例: --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> を使用する場合、指定されたパターンのいずれかに著者が一致するコミットが選択されます (複数の --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

親が複数あるコミットを出力しません。これは --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 が、コマンドラインで <commit> としてリストされているかのように振る舞います。

--branches[=<pattern>]

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

--tags[=<pattern>]

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

--remotes[=<pattern>]

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

--glob=<glob-pattern>

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

--exclude=<glob-pattern>

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

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

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

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

--reflog

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

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

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

たとえば、2つのブランチ AB がある場合、それらのいずれかの側にあるすべてのコミットをリストする通常の方法は --left-right です (--left-right オプションの説明の以下の例を参照)。ただし、これは他のブランチからチェリーピックされたコミットを表示します (たとえば、「3rd on b」はブランチ 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...mybranchgit cherry upstream mybranch と同様です。

-g
--walk-reflogs

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

oneline および reference (明らかな理由により) 以外の --pretty 形式の場合、これにより 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> の子孫であるコミット、または <commit> 自身であるコミットのみを表示します。コミットが指定されていない場合、commit1 (範囲の除外部分) を <commit> として使用します。複数回渡すことができます。その場合、コミットは、与えられたコミットのいずれかである場合、またはそれらのいずれかの祖先または子孫である場合に含められます。

より詳細な説明を以下に示します。

<paths> として 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」のみを含みます。

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

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

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

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

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

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 はすべてウォークされましたが、!TREESAME だったのは B だけであったため、他は表示されません。

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

--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 と比較して、NP、および Q の主要な違いに注目してください。

  • N の親リストは、他の親 M の祖先であるため、I が削除されました。それでも、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 の祖先であるコミットは除外します。これは、「M には D にはなかった何があるか」という意味で、D 以降の M に至る履歴で何が起こったかを確認するのに役立ちます。この例の結果は、AB (もちろん D 自身も) を除くすべてのコミットになります。

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

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

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

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

		E
		 \
	      C---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 は、Mfile.txt の内容を無視し、Xfile.txt の内容のみを取ることによって作成されました。したがって、RX に対して TREESAME ですが、M に対してはそうではありません。最後に、N を作成するための自然なマージ解決は、Rfile.txt の内容を取ることであるため、NR に対して TREESAME ですが、C に対してはそうではありません。マージコミット OP は、それぞれ最初の親に対して TREESAME ですが、2番目の親である ZY に対してはそうではありません。

デフォルトモードを使用すると、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番目の問題は監査に関するものです。多くのコントリビューターが同じリポジトリで作業している場合、どのマージコミットが重要なブランチに変更を導入したかが重要です。上記の問題のあるマージ 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---

ここで数字はコミットのタイムスタンプ順を表し、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>

指定された形式でコミットログの内容を整形して出力します。<format>onelineshortmediumfullfullerreferenceemailrawformat:<string>、および tformat:<string> のいずれかになります。<format> が上記のいずれでもなく、かつ %placeholder を含む場合、--pretty=tformat:<format> が与えられたかのように機能します。

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

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

--abbrev-commit

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

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

--no-abbrev-commit

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

--oneline

これは、「--pretty=oneline --abbrev-commit」を一緒に使用するショートハンドです。

--encoding=<encoding>

コミットオブジェクトは、ログメッセージに使用される文字エンコーディングをエンコーディングヘッダーに記録します。このオプションを使用して、コマンドにコミットログメッセージをユーザーが好むエンコーディングで再エンコードするように指示できます。非プラミングコマンドの場合、これは 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スペースでインデントする整形形式 (つまり、デフォルトである mediumfull、および fuller) ではタブが展開されます。

--notes[=<ref>]

コミットログメッセージを表示するときに、コミットに注釈を付ける注釈 (git-notes[1] を参照) を表示します。これは、コマンドラインで --pretty--format、または --oneline オプションが指定されていない場合の git loggit show、および git 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 設定変数は、log コマンドの --date オプションのデフォルト値を設定します。デフォルトでは、日付は元のタイムゾーン (コミッターまたは著者のいずれか) で表示されます。-local が形式に追加された場合 (例: iso-local)、代わりにユーザーのローカルタイムゾーンが使用されます。

--date=relative は、現在時刻に対する相対的な日付を表示します (例: 「2 hours ago」)。-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 形式でタイムスタンプを表示します。これは電子メールメッセージでよく見られます。

--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:... は、... をシステム strftime に渡します。ただし、%s、%z、および %Z は内部で処理されます。--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…​」の形式)。親の書き換えも有効になります。上記の「History Simplification」を参照してください。

--children

コミットの子も出力します (「commit child…​」の形式)。親の書き換えも有効になります。上記の「History Simplification」を参照してください。

--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 と組み合わせることはできません。

これにより親の書き換えが有効になります。上記の「History Simplification」を参照してください。

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

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

--graph を使用しない場合、すべての履歴ブランチがフラット化され、2 つの連続するコミットが線形ブランチに属していないことを把握しにくくなります。このオプションは、その場合にそれらの間にバリアを挿入します。<barrier> が指定されている場合、それはデフォルトの文字列の代わりに表示される文字列です。

PRETTY FORMATS

コミットがマージであり、pretty-format が oneline, email, または raw でない場合、Author: 行の前に追加の行が挿入されます。この行は "Merge: " で始まり、祖先コミットのハッシュがスペースで区切られて表示されます。表示されるコミットは、履歴の表示を制限している場合(たとえば、特定のディレクトリやファイルに関連する変更のみに関心がある場合など)には、直接の親コミットのリストと必ずしも一致しないことに注意してください。

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

  • oneline

    <hash> <title-line>

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

  • short

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

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

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

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

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

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

  • 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 情報は、graft や履歴の単純化を考慮せずに、真の親コミットを表示します。このフォーマットはコミットの表示方法に影響しますが、たとえば git log --raw のように diff の表示方法には影響しないことに注意してください。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(…​)

      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

    参照ログセレクタ、例: refs/stash@{1} または refs/stash@{2 minutes ago}。形式は -g オプションで説明されているルールに従います。@ より前の部分はコマンドラインで与えられた参照名です (したがって git log -g refs/heads/masterrefs/heads/master@{0} を生成します)。

    %gd

    短縮された参照ログセレクタ。%gD と同じですが、人間が読みやすいように参照名部分が短縮されます (したがって refs/heads/master は単に master になります)。

    %gn

    リフロッグ識別名

    %gN

    リフロッグ識別名 (.mailmap を尊重。 git-shortlog[1] または git-blame[1] を参照)

    %ge

    リフロッグ識別メール

    %gE

    リフロッグ識別メール (.mailmap を尊重。 git-shortlog[1] または git-blame[1] を参照)

    %gs

    リフロッグ件名

    %(trailers[:<options>])

    git-interpret-trailers[1] によって解釈されるボディのトレーラーを表示します。trailers 文字列の後にコロンとゼロ個以上のカンマ区切りのオプションを続けることができます。複数のオプションが指定された場合、最後に指定されたオプションが優先されます。

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

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

    • separator=<sep>: トレーラー行の間に挿入される区切り文字を指定します。デフォルトは改行文字です。文字列 <sep> は上記の literal formatting codes を含めることができます。カンマを区切り文字として使用するには %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* リフロッグオプションは、リフロッグエントリを巡回している場合 (例: git log -g) を除いて、空の文字列を挿入します。%d および %D プレースホルダは、コマンドラインで --decorate がまだ指定されていない場合、「short」装飾形式を使用します。

ブールオプションはオプション値 [=<bool-value>] を受け入れます。--type=bool git-config[1] で使用される値 (例: yesoff) はすべて受け入れられます。=<value> なしでブールオプションを指定することは、=true で指定することと同じです。

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

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

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

  • tformat

    tformat: 形式は、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

DIFF FORMATTING

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

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

-p
-u
--patch

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

-s
--no-patch

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

-m

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

-c

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

--cc

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

--dd

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

--remerge-diff

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

--no-diff-merges

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

--diff-merges=<format>

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

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

off, none

マージコミットの diff 出力を無効にします。暗黙の値を上書きするのに便利です。

on, m

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

first-parent, 1

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

separate

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

combined, c

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

dense-combined, cc

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

remerge, r

2 つの親を持つマージコミットを再マージして、一時的なツリーオブジェクトを作成します (衝突マーカーなどを含む可能性があります)。その後、その一時的なツリーと実際のマージコミットとの間の差分が表示されます。

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

--combined-all-paths

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

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

通常の 3 行ではなく、<n> 行のコンテキストを持つ diff を生成します。--patch を含意します。

--output=<file>

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

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

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

--raw

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

--patch-with-raw

-p --raw の同義語。

-t

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

--indent-heuristic

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

--no-indent-heuristic

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

--minimal

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

--patience

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

--histogram

「ヒストグラム diff」アルゴリズムを使用して差分を生成します。

--anchored=<text>

「アンカー付き diff」アルゴリズムを使用して差分を生成します。

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

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

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

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

default
myers

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

minimal

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

patience

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

histogram

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

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

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

差分統計を生成します。デフォルトでは、ファイル名部分には必要なだけのスペースが使用され、残りはグラフ部分に充てられます。最大幅はデフォルトでターミナルの幅、ターミナルに接続されていない場合は 80 列で、<width> で上書きできます。ファイル名部分の幅は、カンマの後に別の幅 <name-width> を指定するか、diff.statNameWidth=<name-width> を設定することで制限できます。グラフ部分の幅は、--stat-graph-width=<graph-width> を使用するか、diff.statGraphWidth=<graph-width> を設定することで制限できます。--stat または --stat-graph-width を使用すると、統計グラフを生成するすべてのコマンドに影響しますが、diff.statNameWidth または diff.statGraphWidth を設定しても git format-patch には影響しません。3 番目のパラメータ <count> を指定すると、最初の <count> 行に制限し、それ以上ある場合は ... が続きます。

これらのパラメータは、--stat-width=<width>--stat-name-width=<name-width>、および --stat-count=<count> を使用して個別に設定することもできます。

--compact-summary

ファイル作成または削除 (「new」または「gone」、オプションでシンボリックリンクの場合は +l)、およびモード変更 (実行可能ビットの追加または削除にはそれぞれ +x または -x) などの拡張ヘッダ情報の凝縮された概要を diffstat で出力します。情報はファイル名部分とグラフ部分の間に配置されます。--stat を含意します。

--numstat

--stat と似ていますが、追加および削除された行数を 10 進表記で表示し、パス名を省略せずに表示するため、機械処理に適しています。バイナリファイルの場合、0 0 と表示する代わりに 2 つの - を出力します。

--shortstat

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

-X [<param>,...]
--dirstat[=<param>,...]

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

changes

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

lines

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

files

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

cumulative

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

<limit>

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

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

--cumulative

--dirstat=cumulative の同義語。

--dirstat-by-file[=<param>,...]

--dirstat=files,<param>,... の同義語。

--summary

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

--patch-with-stat

-p --stat の同義語。

-z

コミットを改行の代わりに 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>]

色付き diff を表示します。--color (つまり =<when> なし) は --color=always と同じです。<when>alwaysnever、または auto のいずれかです。

--no-color

カラー差分をオフにします。--color=never と同じです。

--color-moved[=<mode>]

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

no

移動した行はハイライトされません。

default

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

plain

ある場所で追加され、別の場所で削除された行は、color.diff.newMoved で色付けされます。同様に、diff の別の場所で追加された削除行には 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

空のブロブを名前変更元として使用するかどうか。

--check

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

--ws-error-highlight=<kind>

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

--full-index

パッチ形式出力を生成する際に、「index」行に最初の数文字ではなく、プレイメージとポストイメージの完全なブロブオブジェクト名を表示します。

--binary

--full-index に加えて、git-apply で適用できるバイナリ差分を出力します。--patch を含意します。

--abbrev[=<n>]

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

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

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

ファイル全体の書き換えに相当する変更を、非常に少数の行がテキスト的にコンテキストと一致する一連の削除と挿入としてではなく、古いものをすべて削除し、新しいものをすべて挿入する単一の変更として扱います。そして、数値 <m>-B オプションのこの側面を制御します (デフォルトは 60%)。-B/70% は、Git がファイルを完全な書き換えと見なすために、元の 30% 未満が結果に残るべきであることを指定します (つまり、そうでなければ、結果のパッチはコンテキスト行と混合された一連の削除と挿入になります)。

-M と組み合わせて使用すると、完全に書き換えられたファイルも名前変更のソースと見なされ (-M は通常、消滅したファイルのみを名前変更のソースと見なします)、数値 <n>-B オプションのこの側面を制御します (デフォルトは 50%)。-B20% は、ファイルのサイズの 20% 以上の追加と削除を伴う変更が、別のファイルへの名前変更の可能性のあるソースとして検出される資格があることを指定します。

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

差分を生成する場合、各コミットの名前変更を検出して報告します。履歴を巡回する際に名前変更を追跡するファイルについては、--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 の差分は出力しません。結果のパッチは patchgit 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 を検索します。

オブジェクトはブロブまたはサブモジュールコミットにできます。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> 内のグロブパターンの順序によって決定されます。最初のパターンに一致するパス名を持つすべてのファイルが最初に出力され、2 番目のパターン (ただし最初のパターンには一致しない) に一致するパス名を持つすべてのファイルが次に出力され、以降同様です。どのパターンにも一致しないパス名を持つすべてのファイルは最後に出力されます。これは、ファイルの末尾に暗黙の「すべて一致」パターンがあったかのように扱われます。複数のパス名が同じランク (同じパターンに一致するが、それより前のパターンには一致しない) を持つ場合、それらの相対的な出力順序は通常の順序になります。

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

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

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

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

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

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

指定された<file>より前のファイルを、出力から破棄する(つまりスキップする)か、出力の末尾に移動する(つまり回転させる)。これらのオプションは主にgit difftoolコマンドで使用するために考案されたものであり、それ以外ではあまり有用ではないかもしれません。

-R

2つの入力を交換します。つまり、インデックスまたはディスク上のファイルとツリーの内容との差分を表示します。

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

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

-a
--text

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

--ignore-cr-at-eol

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

--ignore-space-at-eol

行末の空白の変更を無視します。

-b
--ignore-space-change

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

-w
--ignore-all-space

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

--ignore-blank-lines

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

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

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

--inter-hunk-context=<number>

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

-W
--function-context

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

--ext-diff

外部のdiffヘルパーの実行を許可します。gitattributes[5]で外部diffドライバーを設定した場合、git-log[1]とその仲間と一緒にこのオプションを使用する必要があります。

--no-ext-diff

外部diffドライバーの使用を禁止します。

--textconv
--no-textconv

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

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

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

--src-prefix=<prefix>

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

--dst-prefix=<prefix>

"b/" の代わりに指定された宛先 <prefix> を表示します。

--no-prefix

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

--default-prefix

デフォルトのソースおよびデスティネーションプレフィックス("a/"と"b/")を使用します。これにより、diff.noprefixdiff.srcPrefixdiff.dstPrefixdiff.mnemonicPrefixなどの設定変数が上書きされます(git-config[1]を参照)。

--line-prefix=<prefix>

出力の各行に、追加の<prefix>を付加します。

--ita-invisible-in-index

デフォルトでは、git add -Nで追加されたエントリは、git diffでは既存の空ファイルとして、git diff --cachedでは新しいファイルとして表示されます。このオプションは、git diffでは新しいファイルとして、git diff --cachedでは存在しないファイルとしてエントリを表示します。このオプションは--ita-visible-in-indexで元に戻すことができます。両オプションは実験的なものであり、将来削除される可能性があります。

これらの共通オプションの詳細については、gitdiffcore[7]も参照してください。

-p によるパッチテキストの生成

-pオプションを指定して、git-diff[1]git-log[1]git-show[1]git-diff-index[1]git-diff-tree[1]、またはgit-diff-files[1]を実行すると、パッチテキストが生成されます。パッチテキストの作成は、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>

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

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

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

    インデックス行には、変更前と変更後のブロブオブジェクト名が含まれます。ファイルモードが変更されない場合は<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. Hunkヘッダは、そのhunkが適用される関数の名前を示します。特定の言語に合わせてこれを調整する方法の詳細については、gitattributes[5]の「カスタムhunkヘッダの定義」を参照してください。

統合diff形式

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

"結合差分"形式は次のようになります

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

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

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

    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>の差分で機能するように設計されており、結合差分形式では使用されません。

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

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

    従来のunified diff形式の2行ヘッダーと同様に、/dev/nullは作成または削除されたファイルを示すために使用されます。

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

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

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

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

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

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

-(マイナス — AにはあるがBでは削除)、+(プラス — AにはないがBに追加)、または" "(スペース — 変更なし)のプレフィックスを持つ単一の列で2つのファイルAとBを表示する従来のunified diff形式とは異なり、この形式は2つ以上のファイルfile1、file2、...と1つのファイルXを比較し、Xが各fileNとどのように異なるかを示します。Xの行がfileNとどのように異なるかを記録するために、各fileNの列が出力行の前に付けられます。

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

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

git diff-tree -cで表示される場合、マージコミットの親とマージ結果を比較します(つまり、file1..fileNは親です)。git diff-files -cで表示される場合、未解決のマージ親2つと作業ツリーファイルを比較します(つまり、file1はステージ2、別名「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

ファイルgitkへの過去2週間の変更を表示します。--は、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

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

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

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

git log -3

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

考察

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

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

  • パス名はUTF-8正規化形式Cでエンコードされます。これは、ツリーオブジェクト、インデックスファイル、参照名、コマンドライン引数、環境変数、設定ファイル(.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 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]を、diff生成に関連する設定については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は特定の既知のref名前空間の装飾のみを表示します。allが指定されている場合、すべてのrefを装飾として表示します。

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の場合、最初のコミットは大きな作成イベントとして表示されます。これは空のツリーに対する差分と同じです。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 で上書きできます。これはコロン区切りのリファレンスまたはグロブのリストである必要があります。

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

この設定は、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