Git
日本語 ▾ トピック ▾ 最新バージョン ▾ 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* などのツール、または次の段落で簡単に説明する「pickaxe」インターフェースを使用する必要があります。

ファイルの注釈に加えて、Gitはコードスニペットが変更にいつ現れたかを開発履歴から検索することもサポートしています。これにより、コードスニペットがファイルに追加された時期、ファイル間で移動またはコピーされた時期、そして最終的に削除または置換された時期を追跡することができます。これは、diff内でテキスト文字列を検索することによって機能します。`blame_usage` を検索するpickaxeインターフェースの簡単な例を以下に示します。

$ 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] の *カスタムハンクヘッダーの定義* を参照)。

-l

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

-t

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

-S <revs-file>

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

--reverse <rev>..<rev>

履歴を後ろ向きではなく前向きに歩きます。行が現れたリビジョンを表示する代わりに、行が存在していた最後のリビジョンを表示します。これには、START..END のようなリビジョンの範囲が必要です。ここで、blameのパスは START に存在します。便宜上、`git blame --reverse START` は `git blame --reverse START..HEAD` として扱われます。

--first-parent

マージコミットを見つけた場合、最初の親コミットのみをたどります。このオプションを使用すると、行が履歴全体に導入された時期ではなく、特定の統合ブランチに導入された時期を特定できます。

-p
--porcelain

機械が消費しやすいように設計された形式で表示します。

--line-porcelain

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

--incremental

機械が消費しやすいように設計された形式で、結果を段階的に表示します。

--encoding=<encoding>

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

--contents <file>

指定されたファイルの内容を使用して注釈を付けます。<rev> が指定されている場合は <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の割り当て時に、リビジョンによって行われた変更を、変更がなかったかのように無視します。無視されたコミットによって変更または追加された行は、その行または近くの行を変更した以前のコミットに責任を負わされます。このオプションは、複数のリビジョンを無視するために複数回指定できます。 blame.markIgnoredLines設定オプションが設定されている場合、無視されたコミットによって変更され、別のコミットに起因する行は、blame出力で?でマークされます。 blame.markUnblamableLines設定オプションが設定されている場合、無視されたコミットによって変更され、他のリビジョンに起因させることができなかった行は、*でマークされます。

--ignore-revs-file <file>

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

--color-lines

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

--color-by-age

デフォルトの形式で行の antigüedad に応じて、行注釈の色分けを行います。 color.blame.highlightRecent設定オプションは、各 antigüedad 範囲に使用される色を制御します。

-h

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

-c

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

--score-debug

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

-f
--show-name

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

-n
--show-number

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

-s

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

-e
--show-email

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

-w

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

--abbrev=<n>

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

デフォルトのフォーマット

--porcelainまたは--incrementalオプションのいずれも指定されていない場合、git blameは各行の注釈を

  • 行の Herkunft であるコミットの省略されたオブジェクト名。

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

  • 行番号

を行の内容の前に出力します。

PORCELAINフォーマット

この形式では、各行はヘッダーの後に出力されます。ヘッダーには、少なくとも最初の行が含まれており、

  • 行が起因するコミットの40バイトのSHA-1。

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

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

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

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

  • 作成者名("author")、電子メール("author-mail")、時刻("author-time")、およびタイムゾーン("author-tz")。コミッターも同様です。

  • 行が起因するコミットのファイル名。

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

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

Porcelain形式は、一般に、すでに表示されているコミット情報を抑制します。たとえば、同じコミットに責任を負わされる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

範囲の指定

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

ファイルfooの40〜60行の Herkunft を見つけることに関心がある場合は、次のように-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