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

説明

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

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

行の起源は、ファイル全体の名前変更をまたがって自動的に追跡されます(現在、名前変更追跡をオフにするオプションはありません)。あるファイルから別のファイルに移動した行、または別のファイルからコピー&ペーストされた行などを追跡するには、-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から数えます)。

  • /regex/

    この形式は、指定された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)を子コミットに責任を割り当てます。このオプションを使用すると、追加の検査パスを実行することにより、両方の行グループが親に責任を割り当てられます。

<num> はオプションですが、Gitがファイル内で移動/コピーとして検出する必要がある英数字の最小数を指定し、それらの行を親コミットと関連付けます。デフォルト値は20です。

-C[<num>]

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

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

--ignore-rev <rev>

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

--ignore-revs-file <file>

file にリストされているリビジョンを無視します。filefsck.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桁の16進数を使用する代わりに、<m>+1桁を使用します。ここで、<m> は少なくとも <n> ですが、コミットオブジェクト名が一意であることを保証します。1列が境界コミットをマークするためのキャレットに使用されることに注意してください。

デフォルト形式

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

  • その行が由来するコミットの省略されたオブジェクト名;

  • 作者識別子(デフォルトでは作者名と日付。-s または -e が指定されていない限り);そして

  • 行番号

行の内容の前に。

PORCELAIN形式

この形式では、各行はヘッダーの後に表示されます。ヘッダーの最小限として、最初の行には以下が含まれます。

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

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

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

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

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

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

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

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

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

porcelain形式は、通常、すでに見たコミット情報を抑制します。例えば、同じコミットに帰属する2つの行は両方表示されますが、そのコミットの詳細は一度だけ表示されます。これは効率的ですが、読み取り側でより多くの状態を保持する必要がある場合があります。--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 blame* や *git 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週間以上前の最新のコミットのいずれか)から変更されていない行は、その範囲境界コミットに帰属します。

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

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. Porcelain形式とは異なり、ファイル名情報は常に提供され、エントリを終了します。

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

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

    注記
    解析を行う方へ:より堅牢にするには、最初の行と最後の行(「<sha1>」と「filename」行)の間の行で、"拡張情報" 行の先頭にあるタグワードを認識しない(または特定のタグワードに関心がない)行は無視してください。そうすることで、コミットエンコーディングや拡張コミットコメントなどの情報が追加されても、blameビューアは影響を受けません。

作者のマッピング

gitmailmap[5] を参照。

設定

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

blame.blankBoundary

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

blame.coloring

これは、blame出力に適用される色付けスキームを決定します。*repeatedLines*、*highlightRecent*、またはデフォルトである *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行に1つの非省略オブジェクト名)を無視します。空白と # で始まるコメントは無視されます。このオプションは複数回繰り返すことができます。空のファイル名は、無視されるリビジョンリストをリセットします。このオプションは、コマンドラインオプション --ignore-revs-file の前に処理されます。

blame.markUnblamableLines

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

blame.markIgnoredLines

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

関連項目

GIT

git[1] スイートの一部

scroll-to-top