Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
-
2.50.0
2025-06-16
- 2.44.1 → 2.49.0 no changes
-
2.44.0
2024-02-23
- 2.43.1 → 2.43.6 no changes
-
2.43.0
2023-11-20
- 2.41.1 → 2.42.4 no changes
-
2.41.0
2023-06-01
- 2.38.1 → 2.40.4 no changes
-
2.38.0
2022-10-02
- 2.34.1 → 2.37.7 no changes
-
2.34.0
2021-11-15
- 2.31.1 → 2.33.8 no changes
- 2.31.0 no changes
- 2.30.1 → 2.30.9 no changes
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 no changes
-
2.29.0
2020-10-19
- 2.23.1 → 2.28.1 no changes
-
2.23.0
2019-08-16
- 2.16.6 → 2.22.5 no changes
- 2.15.4 no changes
- 2.13.7 → 2.14.6 no changes
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
- 2.9.5 → 2.10.5 no changes
-
2.8.6
2017-07-30
-
2.7.6
2017-07-30
- 2.6.7 no changes
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
- 2.1.4 → 2.2.3 no changes
-
2.0.5
2014-12-17
概要
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」インターフェースなどのツールを利用してください。
ファイルへの注釈付け(blame)機能に加えて、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 <開始>,<終了>
- -L :<関数名>
-
<開始>,<終了> または関数名の正規表現 <関数名> で指定した範囲の行だけに注釈を付けます。複数回指定でき、範囲が重なっても問題ありません。
<開始> と <終了> は省略できます。
-L <開始>
または-L <開始>,
なら <開始> からファイル末尾まで、-L ,<終了>
ならファイル先頭から <終了> までが対象です。
Warning
|
Missing See original version for this content. |
- -l
-
完全なリビジョン(長い形式)を表示します(デフォルトは非表示)。
- -t
-
生のタイムスタンプを表示します(デフォルトは非表示)。
- -S <リビジョンファイル>
-
git-rev-list[1] を使わず、指定したリビジョンファイルの内容を利用します。
- --reverse <リビジョン>..<リビジョン>
-
履歴を通常とは逆に(過去から未来へ)たどります。各行が現れたリビジョンではなく、その行が最後に存在したリビジョンを表示します。START..END のようなリビジョン範囲が必要で、START に blame 対象のパスが存在している必要があります。
git blame --reverse START
はgit blame --reverse START..HEAD
と同じ意味になります。 - --first-parent
-
マージコミットに出会った場合、最初の親コミットだけをたどります。これにより、全体の履歴ではなく、特定の統合ブランチに行が追加されたタイミングを調べることができます。
- -p
- --porcelain
-
機械処理しやすい形式で出力します。
- --line-porcelain
-
porcelain フォーマットで、すべての行ごとにコミット情報を出力します(最初の参照時だけでなく全行)。--porcelain を含みます。
- --incremental
-
機械処理しやすい形式で、結果を順次出力します。
- --encoding=<エンコーディング>
-
著者名やコミット要約の出力エンコーディングを指定します。
none
を指定すると変換せずそのまま出力します。詳しくは git-log[1] のエンコーディングの説明を参照してください。 - --contents <ファイル>
-
指定したファイルの内容を使って注釈を付けます。<rev> を指定しない場合は HEAD から開始します。ファイル名に - を指定すると標準入力から内容を読み込みます。
- --date <フォーマット>
-
日付の出力フォーマットを指定します。--date を指定しない場合は blame.date 設定値が使われ、設定がなければ iso 形式になります。利用可能な値は git-log[1] の --date オプションの説明を参照してください。
- --[no-]progress
-
進捗状況は、デフォルトでは標準エラー出力が端末に接続されている場合に表示されます。このフラグを指定すると、端末に接続されていなくても進捗が表示されます。
--progress
は--porcelain
や--incremental
と同時に使用できません。 - -M[<数値>]
-
ファイル内で移動やコピーされた行を検出します。たとえば、A→B だったものが B→A になるような変更では、従来の blame では一方しか検出できませんが、このオプションを使うと両方の行を親コミットに帰属させるよう追加で検査します。
<数値>は省略可能で、Gitが移動やコピーとみなすために必要な英数字の最小文字数です。デフォルトは20です。
- -C[<数値>]
-
-M
に加えて、同じコミット内で他のファイルから移動またはコピーされた行も検出します。規模が大きいリファクタリング時に便利です。このオプションを2回指定すると、ファイルを新規作成したコミット内の他のファイルからのコピーも検出対象になります。3回指定した場合は、あらゆるコミット内の他のファイルからのコピーも検出されます。<num> は省略可能ですが、Gitがファイル間で移動やコピーと判定するために必要な英数字の最小文字数を指定します。デフォルト値は40です。
-C
オプションが複数指定された場合、最後に指定した-C
の <num> が有効になります。 - --ignore-rev <リビジョン>
-
Ignore changes made by the revision when assigning blame, as if the change never happened. Lines that were changed or added by an ignored commit will be blamed on the previous commit that changed that line or nearby lines. This option may be specified multiple times to ignore more than one revision. If the
blame.markIgnoredLines
config option is set, then lines that were changed by an ignored commit and attributed to another commit will be marked with a?
in the blame output. If theblame.markUnblamableLines
config option is set, then those lines touched by an ignored commit that we could not attribute to another revision are marked with a *. In the porcelain modes, we print ignored and unblamable on a newline respectively. - --ignore-revs-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桁の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")。
実際の行の内容は、上記ヘッダーの後にタブで区切って出力されます。これは将来的にヘッダー要素を追加できるようにするためです。
The porcelain format generally suppresses commit information that has already been seen. For example, two lines that are blamed to the same commit will both be shown, but the details for that commit will be shown only once. Information which is specific to individual lines will not be grouped together, like revs to be marked ignored or unblamable. This is more efficient, but may require more state be kept by the reader. The --line-porcelain
option can be used to output full commit information for each line, allowing simpler (but less efficient) usage like:
# 各著者に帰属する行数をカウントする例 git blame --line-porcelain file | sed -n 's/^author //p' | sort | uniq -c | sort -rn
範囲の指定
古いバージョンの 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フォーマットに似ていますが、注釈対象ファイルの実際の行内容は含まれません。
-
各blameエントリは必ず次の形式の行から始まります:
<40バイトの16進SHA1> <元の行番号> <結果の行番号> <行数>
行番号は1から始まります。
-
ストリーム内でコミットが初めて現れるとき、そのコミットに関するさまざまな追加情報(著者、メールアドレス、コミッター、日付、サマリーなど)が、各行の先頭に1語のタグを付けて出力されます。
-
Porcelainフォーマットとは異なり、ファイル名情報は常に出力され、エントリの終端となります:
"filename" <ここに空白で囲まれたファイル名が入る>
そのため、行指向・単語指向のパーサー(多くのスクリプト言語で自然に扱えるもの)で非常に簡単に解析できます。
Noteパース処理を行う方へ: より堅牢にするには、最初と最後(「<sha1>」行と「filename」行)の間にある「拡張情報」行で、先頭のタグ単語が分からない(または必要ない)行は無視してください。そうすれば、将来コミットのエンコーディングや拡張コメントなどの情報が追加されても、blameビューアは問題なく動作します。
MAPPING AUTHORS
gitmailmap[5] を参照。
設定
このセクションのこの行以下は、 git-config[1] のドキュメントから抜粋して含まれています。内容は同ドキュメントにあるものと同じです:
Warning
|
Missing See original version for this content. |
GIT
Part of the git[1] suite