English ▾ トピック ▾ 最新バージョン ▾ git-blame は 2.50.0 で最終更新されました

名前

git-blame - ファイルの各行を最後に変更したリビジョンと著者を表示する

概要

git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental]
	    [-L <range>] [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>]
	    [--ignore-rev <rev>] [--ignore-revs-file <file>]
	    [--color-lines] [--color-by-age] [--progress] [--abbrev=<n>]
	    [ --contents <file> ] [<rev> | --reverse <rev>..<rev>] [--] <file>

説明

指定されたファイルの各行に、その行を最後に変更したリビジョンからの情報を付与します。オプションで、指定されたリビジョンからアノテーションを開始できます。

1回以上指定された場合、-L はアノテーションを要求された行に制限します。

行の出所は、ファイル全体の名前変更にわたって自動的に追跡されます(現在、名前変更追跡をオフにするオプションはありません)。あるファイルから別のファイルに移動した行、または別のファイルからコピー&ペーストされた行などを追跡するには、-C および -M オプションを参照してください。

このレポートは、削除または置換された行については何も伝えません。git diff や、次の段落で簡単に触れている「ピックアックス」インターフェースのようなツールを使用する必要があります。

ファイルの注釈付けをサポートするだけでなく、Gitはコードスニペットが変更でいつ発生したかを開発履歴で検索することもサポートしています。これにより、コードスニペットがファイルに追加された時期、ファイル間で移動またはコピーされた時期、最終的に削除または置換された時期を追跡できます。これは、diffでテキスト文字列を検索することで機能します。 blame_usage を検索するピックアックスインターフェースの小さな例。

$ git log --pretty=oneline -S'blame_usage'
5040f17eba15504bad66b14a645bddd9b015ebb7 blame -S <ancestry-file>
ea4c7f9bf69e781dd0cd88d2bccb2bf5cc15c9a7 git-blame: Make the output

オプション

-b

境界コミットに対して空白の SHA-1 を表示します。これは blame.blankBoundary 設定オプションでも制御できます。

--root

ルートコミットを境界として扱いません。これは blame.showRoot 設定オプションでも制御できます。

--show-stats

blame出力の最後に、追加の統計を含めます。

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

<start>,<end> で与えられた行範囲、または関数名の正規表現 <funcname> の行のみに注釈を付けます。複数回指定できます。重複する範囲も許可されます。

<start><end> はオプションです。-L <start> または -L <start>,<start> からファイルの終わりまでを範囲とします。-L ,<end> はファイルの最初から <end> までを範囲とします。

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

  • 番号

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

  • /正規表現/

    この形式は、与えられた POSIX 正規表現に最初にマッチする行を使用します。<start> が正規表現の場合、以前の -L 範囲があればその終わりから、なければファイルの最初から検索します。<start>^/regex/ の場合、ファイルの最初から検索します。<end> が正規表現の場合、<start> で指定された行から検索を開始します。

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

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

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

-l

長いリビジョンを表示します (デフォルト: オフ)。

-t

生のタイムスタンプを表示します (デフォルト: オフ)。

-S <revs-file>

git-rev-list[1] を呼び出す代わりに、revs-file からリビジョンを使用します。

--reverse <rev>..<rev>

履歴を逆方向ではなく順方向にたどります。行が出現したリビジョンを表示する代わりに、行が存在した最後のリビジョンを表示します。これには、START で blame するパスが存在する START..END のようなリビジョンの範囲が必要です。便宜上、git blame --reverse STARTgit blame --reverse START..HEAD と解釈されます。

--first-parent

マージコミットに遭遇した場合、最初の親コミットのみを追跡します。このオプションは、行が全体的な履歴に導入された時期ではなく、特定の統合ブランチに導入された時期を判断するために使用できます。

-p
--porcelain

機械処理に適した形式で表示します。

--line-porcelain

porcelain形式で表示しますが、コミットが最初に参照された場合だけでなく、各行のコミット情報を出力します。--porcelain を含意します。

--incremental

結果を機械処理に適した形式で段階的に表示します。

--encoding=<encoding>

作者名とコミット要約を出力するために使用されるエンコーディングを指定します。none に設定すると、blame は変換されていないデータを出力します。詳細については、git-log[1] マニュアルページのエンコーディングに関する説明を参照してください。

--contents <file>

指定されていれば <rev> から、そうでなければ HEAD から、指定されたファイルの内容を使用してアノテーションを付けます。ファイルの内容を標準入力から読み込むには - を指定できます。

--date <format>

日付の出力に使用される形式を指定します。--date が指定されていない場合、blame.date 設定変数の値が使用されます。blame.date 設定変数も設定されていない場合、iso 形式が使用されます。サポートされている値については、git-log[1] の --date オプションの説明を参照してください。

--[no-]progress

デフォルトでは、標準エラー出力がターミナルに接続されている場合にプログレスステータスが報告されます。このフラグは、ターミナルに接続されていない場合でもプログレスレポートを有効にします。--progress--porcelain または --incremental と一緒に使用できません。

-M[<num>]

ファイル内の移動またはコピーされた行を検出します。コミットがブロックの行を移動またはコピーした場合(例:元のファイルにAとBがあり、コミットがそれをBとAに変更した場合)、従来の blame アルゴリズムは移動の半分しか認識せず、通常、上に移動した行(つまりB)を親に、下に移動した行(つまりA)を子コミットに blame します。このオプションを使用すると、追加の検査パスを実行することで、両方の行グループが親に blame されます。

<num> はオプションですが、Git がファイル内で移動/コピーとして検出する必要がある英数字の数の下限であり、これらの行を親コミットに関連付けるために使用されます。デフォルト値は 20 です。

-C[<num>]

-M に加えて、同じコミットで変更された他のファイルから移動またはコピーされた行を検出します。これは、プログラムを再編成してコードをファイル間で移動する場合に役立ちます。このオプションを2回指定すると、コマンドはファイルを作成するコミット内の他のファイルからのコピーも検索します。このオプションを3回指定すると、コマンドは任意のコミット内の他のファイルからのコピーも検索します。

<num> はオプションですが、Git がファイル間で移動/コピーとして検出する必要がある英数字の数の下限であり、これらの行を親コミットに関連付けるために使用されます。デフォルト値は 40 です。複数の -C オプションが指定された場合、最後の -C の <num> 引数が有効になります。

--ignore-rev <rev>

blame を割り当てる際に、指定されたリビジョンによる変更を、その変更がなかったかのように無視します。無視されたコミットによって変更または追加された行は、その行または近くの行を変更した以前のコミットに blame されます。このオプションは、複数のリビジョンを無視するために複数回指定できます。blame.markIgnoredLines 設定オプションが設定されている場合、無視されたコミットによって変更され、別のコミットに帰属するとされた行は、blame 出力で ? でマークされます。blame.markUnblamableLines 設定オプションが設定されている場合、無視されたコミットによって触られたものの、別のリビジョンに帰属できなかった行は * でマークされます。porcelain モードでは、それぞれ ignoredunblamable が改行で出力されます。

--ignore-revs-file <file>

file にリストされているリビジョンを無視します。このファイルは fsck.skipList と同じ形式である必要があります。このオプションは繰り返すことができ、これらのファイルは blame.ignoreRevsFile 設定オプションで指定されたファイルの後に処理されます。空のファイル名 "" は、以前に処理されたファイルからのリビジョンのリストをクリアします。

--color-lines

デフォルト形式の行アノテーションで、前の行と同じコミットから来たものと異なる色で表示します。これにより、異なるコミットによって導入されたコードブロックを区別しやすくなります。デフォルトの色はシアンで、color.blame.repeatedLines 設定オプションを使用して調整できます。

--color-by-age

デフォルト形式で、行の古さに応じて行アノテーションに色を付けます。color.blame.highlightRecent 設定オプションは、各年代範囲に使用される色を制御します。

-h

ヘルプメッセージを表示します。

-c

git-annotate[1] と同じ出力モードを使用します (デフォルト: オフ)。

--score-debug

ファイル間の行の移動(-C を参照)およびファイル内の移動した行(-M を参照)に関連するデバッグ情報を含めます。最初にリストされる数値はスコアです。これは、ファイル間またはファイル内で移動されたと検出された英数字の数です。git blame がそれらのコード行が移動されたと見なすには、これが特定のしきい値を超える必要があります。

-f
--show-name

元のコミットでのファイル名を表示します。デフォルトでは、名前変更検出により、異なる名前のファイルから来た行がある場合にファイル名が表示されます。

-n
--show-number

元のコミットでの行番号を表示します (デフォルト: オフ)。

-s

出力から著者名とタイムスタンプを抑制します。

-e
--show-email

著者名ではなく著者メールを表示します (デフォルト: オフ)。これは blame.showEmail 設定オプションでも制御できます。

-w

親バージョンと子バージョンを比較して行の出所を見つける際に、空白文字を無視します。

--abbrev=<n>

デフォルトの 7+1 進数桁を省略オブジェクト名として使用する代わりに、<m>+1 桁を使用します。ここで <m> は少なくとも <n> ですが、コミットオブジェクト名が一意であることを保証します。境界コミットをマークするためのキャレットに 1 列使用されることに注意してください。

デフォルトフォーマット

--porcelain オプションも --incremental オプションも指定されていない場合、git blame は各行のアノテーションを以下のように出力します。

  • その行の元のコミットの省略オブジェクト名;

  • 著者識別子(デフォルトでは著者名と日付。ただし -s または -e が指定されている場合を除く);

  • 行番号

が、行の内容の前に表示されます。

ポーセリンフォーマット

このフォーマットでは、各行がヘッダの後に表示されます。ヘッダには少なくとも以下の最初の行が含まれます。

  • その行が帰属するコミットの 40 バイト SHA-1;

  • 元のファイルにおけるその行の行番号;

  • 最終ファイルにおけるその行の行番号;

  • 前の行とは異なるコミットからの行のグループを開始する行には、このグループの行数が含まれます。その後の行にはこのフィールドは表示されません。

このヘッダ行の後に、各コミットについて少なくとも一度以下の情報が続きます。

  • 著者名("author")、メール("author-mail")、時刻("author-time")、およびタイムゾーン("author-tz")。コミッターについても同様です。

  • その行が帰属するコミット内のファイル名。

  • コミットログメッセージの最初の行("summary")。

実際の行の内容は、上記のヘッダの後に、TAB でプレフィックスされて出力されます。これにより、後でさらに多くのヘッダ要素を追加できるようになります。

porcelain形式は通常、既に見られたコミット情報を抑制します。例えば、同じコミットに blame される2つの行は両方表示されますが、そのコミットの詳細は1回だけ表示されます。個々の行に固有の情報(無視またはunblamableとマークされるリビジョンなど)はグループ化されません。これはより効率的ですが、読者がより多くの状態を保持する必要がある場合があります。--line-porcelain オプションを使用すると、各行の完全なコミット情報を出力でき、よりシンプル(ただし効率は低い)な使用法が可能になります。

# count the number of lines attributed to each author
git blame --line-porcelain file |
sed -n 's/^author //p' |
sort | uniq -c | sort -rn

範囲の指定

以前のバージョンのgitにおける git blamegit annotate とは異なり、アノテーションの範囲は行範囲とリビジョン範囲の両方に制限できます。アノテーションを行範囲に制限する -L オプションは複数回指定できます。

ファイル foo の 40-60 行目の出所を見つけたい場合は、次のように -L オプションを使用できます (これらは同じ意味です — どちらも 40 行目から始まる 21 行を要求しています)。

git blame -L 40,60 foo
git blame -L 40,+21 foo

行範囲を正規表現で指定することもできます。

git blame -L '/^sub hello {/,/^}$/' foo

これは、アノテーションを hello サブルーチンの本体に制限します。

v2.6.18 より古い変更や、3週間より古い変更に興味がない場合は、git rev-list と同様のリビジョン範囲指定子を使用できます。

git blame v2.6.18.. -- foo
git blame --since=3.weeks -- foo

リビジョン範囲指定子を使用してアノテーションを制限する場合、範囲の境界(上記の例ではコミット v2.6.18 または 3 週間以上前の最新コミット)以降に変化していない行は、その範囲の境界コミットに blame されます。

特に便利な方法は、追加されたファイルに既存のファイルからのコピー&ペーストで作成された行があるかどうかを確認することです。時には、これは開発者がずさんであり、コードを適切にリファクタリングしなかったことを示します。まず、次のようにファイルが導入されたコミットを見つけることができます。

git log --diff-filter=A --pretty=short -- foo

そして、commit^! 表記を使って、そのコミットとその親の間の変更に注釈を付けます。

git blame -C -C -f $commit^! -- foo

増分出力

--incremental オプションを指定して呼び出された場合、コマンドは結果を構築しながら出力します。出力は通常、より新しいコミットによって触られた行について最初に記述され(つまり、行は順不同で注釈付けされます)、インタラクティブなビューアで使用されることを意図しています。

出力形式はPorcelain形式に似ていますが、注釈を付けるファイルからの実際の行は含まれていません。

  1. 各 blame エントリは常に以下の行から始まります。

    <40-byte-hex-sha1> <sourceline> <resultline> <num-lines>

    行番号は1から数えます。

  2. ストリームにコミットが初めて表示される場合、そのコミットに関する様々な追加情報が、各行の冒頭に1語のタグ(著者、メール、コミッター、日付、要約など)を付けて出力されます。

  3. ポーセリン形式とは異なり、ファイル名情報は常に提供され、エントリを終了します。

    "filename" <whitespace-quoted-filename-goes-here>

    したがって、行指向および単語指向のパーサー(ほとんどのスクリプト言語にとっては非常に自然なはずです)にとっては、非常に簡単に解析できます。

    パースを行う人へ:より堅牢にするには、最初の行と最後の行(「」と「filename」行)の間に、認識できないタグワード(または特定のタグワードに関心がない)がある「拡張情報」行の開始部分にある行はすべて無視してください。そうすれば、情報が追加された場合(コミットのエンコーディングや拡張コミットコメントなど)、blameビューアはそれを気にしません。

著者のマッピング

gitmailmap[5] を参照。

設定

このセクションのこの行より下のすべての内容は、git-config[1] ドキュメントから選択的に含まれています。内容はそちらで見られるものと同じです。

blame.blankBoundary

git-blame[1] で、境界コミットに対して空白のコミットオブジェクト名を表示します。このオプションのデフォルトは false です。

blame.coloring

これは、blame出力に適用される色付けスキームを決定します。repeatedLineshighlightRecent、またはデフォルトの none を指定できます。

blame.date

git-blame[1] で日付を出力するために使用される形式を指定します。設定されていない場合は、iso 形式が使用されます。サポートされている値については、git-log[1]--date オプションの説明を参照してください。

blame.showEmail

git-blame[1] で、著者名ではなく著者のメールアドレスを表示します。このオプションのデフォルトは false です。

blame.showRoot

git-blame[1] で、ルートコミットを境界として扱いません。このオプションのデフォルトは false です。

blame.ignoreRevsFile

git-blame[1] で、ファイルにリストされているリビジョンを無視します。各行に省略されていないオブジェクト名が1つ記述されます。空白と # で始まるコメントは無視されます。このオプションは複数回繰り返すことができます。空のファイル名は、無視されるリビジョンのリストをリセットします。このオプションは、コマンドラインオプション --ignore-revs-file より前に処理されます。

blame.markUnblamableLines

git-blame[1] の出力で、無視されたリビジョンによって変更されたものの、別のコミットに帰属できなかった行を * でマークします。

blame.markIgnoredLines

git-blame[1] の出力で、無視されたリビジョンによって変更され、別のコミットに帰属した行を ? でマークします。

関連項目

GIT

git[1]スイートの一部

scroll-to-top