SYNOPSIS

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>

DESCRIPTION

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

-L は注釈を指定行に制限します。複数回指定できます。

行の原初は、ファイル自体の名前変更にまたがって自動的に追跡されます(現在のところ、名前変更追跡をオフにするオプションはありません)。 あるファイルから別のファイルに移動した行を追跡したり、別のファイルからコピーして貼り付けた行を追跡したりするには、 -C および -M オプションを参照してください。

レポートには、削除または置換された行については何も表示されません。 以下の段落で簡単に説明する git diffpickaxe インターフェースなどのツールを使用する必要があります。

Gitは、ファイル注釈のサポートとは別に、変更時にコード断片(code snippet)が発生したときの開発履歴の検索もサポートしています。 これにより、コード断片がファイルに追加され、ファイル間で移動またはコピーされ、最終的に削除または置換された時期を追跡できます。 これは、diffでテキスト文字列を検索することで機能します。 blame_usage を検索するpickaxeインターフェースの小さな例:

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

OPTIONS

-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> で指定された行から検索開始します。

  • +offset or -offset

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

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

-l

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

-t

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

-S <revs-file>

git-rev-list(1) を呼び出す代わりに、revs-fileのリビジョンを使用します。

--reverse <rev>..<rev>

履歴を後方へではなく前方へウォークします。行があらわれたされたリビジョンを表示する代わりに、行が存在した最後のリビジョンを表示します。これには、START..END のように、STARTにblameのパスが存在するレビジョン範囲が必要です。 便宜上、 git blame --reverse STARTgit blame --reverse START..HEAD と見なされます。

--first-parent

マージコミットを確認したら、最初の親コミットのみを追跡します。 このオプションは、履歴全体にいつ導入されたかではなく、特定の統合ブランチにいつ導入されたかを判別するために使用できます。

-p
--porcelain

ソフトウェア等で使用するのに適した形式で表示します。

--line-porcelain

磁器形式で表示しますが、コミットが最初に参照されたときだけでなく、各行のコミット情報を出力します。 --porcelain の機能を含んでいます。

--incremental

ソフトウェア等で使用するのに適した形式で結果を段階的(incrementally)に表示します。

--encoding=<encoding>

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

--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」アルゴリズムは移動の半分だけに気づき、通常は行をblameします それは親に上に移動され(つまりB)、子のコミットに下に移動された(つまりA)行にblameを割り当てます。このオプションを使用すると、追加の検査パスを実行することにより、両方のグループの行が親のせいになります。

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

-C[<num>]

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

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

--ignore-rev <rev>

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

--ignore-revs-file <file>

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

--color-lines

前行と同一のコミットからの場合、デフォルト形式の行注釈に異なる色を付けます。 これにより、異なるコミットによって導入されたコード・ブロックを区別しやすくなります。 色のデフォルトはシアン(cyan)で、 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

作者名の代わりに作者の電子メールアドレス(author email)を表示します(デフォルト: オフ)。 これは、 blame.showEmail 構成オプションを介して制御することもできます。

-w

親のバージョンと子のバージョンを比較して、その行がどこから来たのかを見つけるときは、空白(whitespace)を無視します。

--abbrev=<n>

デフォルトの7+1桁の16進数でオブジェクト名を省略する代わりに、<m>+1桁を使用します。ここで<m>は少なくとも<n>ですが、コミットオブジェクト名が一意になるような長さにします。 1列分はコミットの境界を示すカレット(^)に使用されることに注意してください。

THE DEFAULT FORMAT

--porcelain オプションも --incremental オプションも指定されていない場合、git Blame は各行の注釈を以下のとおり出力します:

  • 行の元となったコミットのオブジェクトの省略名

  • 作者ID (-s または -e が指定されていない限り、デフォルトでは作者名と日付)

  • 行番号

上記を行の内容の前に表示します。

THE PORCELAIN FORMAT(磁器形式)

この形式では、各行はヘッダーの後に出力されます。 少なくともヘッダーには、以下のような最初の行があります:

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

  • 元のファイルの行の行番号;

  • 最終ファイルの行の行番号;

  • 前のコミットとは異なるコミットからの行のグループを開始する行においては、そのグループの行数。以降の行では、このフィールドはありません。

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

  • author name ("author") と email ("author-mail") と time ("author-time") と time zone ("author-tz"); コミッターも同様。

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

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

実際の行の内容は、上記のヘッダーの後にTABが前に付いて出力されます。 これは、後でヘッダー要素を追加できるようにするためです。

磁器形式(porcelain format)は、一般的に、既視のコミット情報を抑制します。 たとえば、同じコミットのせいにされた2行が両方とも表示されますが、そのコミットの詳細は1回だけ表示されます。これはより効率的ですが、リーダーがより多くの状態を保持する必要がある場合があります。 --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

SPECIFYING RANGES

古いバージョンのgitの git blamegit annotate と異なり、注釈の範囲は行範囲とリビジョン範囲の両方で制限できます。注釈を行の範囲に制限する -L オプションは、複数回指定できます。

あなたがファイル foo の40〜60行目の行の原初を見つけることに関心がある場合は、以下のように -L オプションを使用できます(2行とも同じ意味です。どちらも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 OUTPUT

--incremental オプションを付けて呼び出すと、ビルドした結果を出力します。 出力は一般に、より新しいコミットによって触れられた行から順に語られます(つまり、行の注釈は順不同になります)。これは、対話的なビューアで使用するためのものです。

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

  1. 各blame項目は必ず行で始まる:

    <40-byte hex sha1> <sourceline> <resultline> <num_lines>

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

  2. コミットがストリームに初めて現れるとき、追加のコミット情報(作成者、電子メール、コミッター、日付、要約など)を説明する1語のタグが各行の先頭に出力されて、コミットに関するその他のさまざまな情報が出力されます。

  3. 磁器形式(Porcelain format)とは異なり、ファイル名情報が常に与えられ、エントリを終了します:

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

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

    Note
    構文解析を行う人の場合: より堅牢にするために、拡張情報行(extended information lines)の先頭にあるタグワード(またはその特定のものを気にする)を認識できない最初の行と最後の行の間の行(<sha1> 行や filename 行)はすべて無視してください。 そうすれば、(コミットエンコーディング(commit encoding)や拡張コミット解説(extended commit commentary)のような)情報が追加されたとしても、blameビュワーは気にしません。

MAPPING AUTHORS

gitmailmap(5) を参照してください。

CONFIGURATION

このセクションの以下のすべては、 git-config(1) ドキュメントの抜粋です。 内容は git-config(1) ドキュメント にあるものと同一です:

blame.blankBoundary

git-blame(1)で境界コミット(boundary commits)の空白コミットオブジェクト名を表示します。このオプションのデフォルトはfalseです。

blame.coloring

これにより、blame出力に適用される配色が決まります。 これは、 repeatedLines または highlightRecent またはデフォルトの none にすることができます。

blame.date

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

blame.showEmail

git-blame(1) で、作者名(author)の代わりに作者の電子メールアドレス(author email)を表示します。 このオプションのデフォルトは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)の出力で、別のコミットに起因する無視されたリビジョンによって変更された行を ? でマークします。

SEE ALSO

GIT

Part of the git(1) suite