git bame コマンドは汎用的なトラブルシューティング ユーティリティで、さまざまな用途に使用できます。git blame の基本的な機能は、ファイルでコミットされた特定の行の作成者メタデータを表示することです。この機能を使ってファイル履歴の特定の時点を調査し、行を最後に修正した作成者が誰なのかを確認できます。これにより、特定のコードの履歴を確認し、どんなコードがどのようにして、どんな理由でリポジトリに追加されたのかがわかるようになります。

git blame は GUI 表示で頻繁に使用されます。Bitbucket などのオンラインの Git ホスティング サイトでは、git blame の UI ラッパーであるブレーム ビューが提供されています。こうしたビューはプル リクエストとコミット時の話し合いで参照されます。また、Git との統合機能を持つほとんどの IDE には動的なブレーム ビューがあります。

動作の概要

git blame をわかりやすく説明するためには、ある程度の履歴があるリポジトリが必要です。ここではオープン ソース プロジェクトの git-blame-example を使用します。こちらは、別々の作成者が作成したコミットがいくつかある README.md ファイルを含むシンプルなリポジトリです。最初の git blame の使い方として、git clone によるサンプル リポジトリのクローンを紹介します。

git clone https://kevzettler@bitbucket.org/kevzettler/git-blame-example.git && cd git-blame-example

これでサンプル コードのコピーができたので、それを使って git blame を実際に試していきましょう。サンプル リポジトリの状態は git log で確認できます。コミット履歴は次のようになっているはずです。

$ git log
    commit 548dabed82e4e5f3734c219d5a742b1c259926b2
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:55:15 2018 +0000

        Another commit to help git blame track the who, the what, and the when

    commit eb06faedb1fdd159d62e4438fc8dbe9c9fe0728b
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:53:23 2018 +0000

        Creating the third commit, along with Kev and Albert, so that Kev can get git blame docs.

    commit 990c2b6a84464fee153253dbf02e845a4db372bb
    Merge: 82496ea 89feb84
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 05:33:01 2018 +0000

        Merged in albert-so/git-blame-example/albert-so/readmemd-edited-online-with-bitbucket-1519865641474 (pull request #2)

        README.md edited online with Bitbucket

    commit 89feb84d885fe33d1182f2112885c2a64a4206ec
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 00:54:03 2018 +0000

        README.md edited online with Bitbucket

git blame ではファイルを個別に扱います。有用な出力を得るにはファイルパスを指定する必要があります。git blame のデフォルトの動作では、コマンドのヘルプ メニューが出力されるだけです。このサンプルでは README.MD ファイルに対して操作を実行します。この方法は、プロジェクトのドキュメント ソースとして README ファイルを git リポジトリのルートに含める、オープン ソース ソフトウェアのプラクティスとして一般的なものです。

git blame README.MD

上のコマンドを実行するとブレーム出力の最初のサンプルを得ることができます。以下の出力は README のブレーム出力全体のサブセットです。また、この出力は静的で、この出力が書き込まれたときのリポジトリの状態を表しています。

$ git blame README.md
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  1) # Git Blame example
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  2)
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  3) This repository is an example of a project with multiple contributors making commits.
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  4)
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  5) The repo use used elsewhere to demonstrate `git blame`
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  6)
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  7) Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod TEMPOR incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  8)
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000  9) Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision.
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000 10)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 11) Creating a line to support documentation needs for git blame.
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 12)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 13) Also, it is important to have a few of these commits to clearly reflect the who, the what and the when. This will help Kev get good screenshots when he runs the git blame on this README.

こちらは README.md ファイルの最初の 13 行のサンプルです。この出力をもっと深く理解するために、それぞれの行に分けて見ていきましょう。以下の表は 3 行目の内容をまとめたもので、表の一番上は各列の内容を表しています。

ID 作成者 timestamp linenumber 行の内容
89feb84d Albert So 2018-03-01 00:54:03 +0000 3 このリポジトリは、複数のコントリビューターがコミットを行うプロジェクトの一例です。

ブレーム出力のリストを確認すると、何点か気づくことがあります。プロジェクトの保守管理者である Kev Zettler の他に、Albert So と Juni Mukherjee という 3 人の作成者が記載されているのがわかります。一般的に、作成者は git blame 出力における最も重要な部分です。タイムスタンプ列も非常に有用です。変更内容は行の内容列に表示されます。

よく使われるオプション

git blame -L 1,5 README.md

-L オプションを指定すると、指定した行の範囲に出力を制限できます。ここでは 1 行目から 5 行目までに出力を制限しています。

git blame -e README.md

-e オプションを指定するとユーザー名ではなく作成者のメール アドレスが表示されます。

git blame -w README.md

-w オプションを指定すると空白の変更が無視されます。前の作成者がタブをスペースにした、または新しい行を追加してファイルのスペースを修正した場合、これらの変更が表示されて git blame の出力がわかりにくくなってしまいます。

git blame -M README.md

-M オプションでは同じファイル内で移動またはコピーされた行を検出できます。最後に行を移動またはコピーした作成者ではなく、行の元の作成者が出力されます。

git blame -C README.md

-C オプションでは、別のファイルから移動またはコピーされた行を検出できます。最後に行を移動またはコピーした作成者ではなく、行の元の作成者が出力されます。

git blame と git log

git belame では行を最後に修正した作成者が表示されますが、最初に行が追加されたのがいつなのかを確認したくなることがよくあります。git blame を使ってこれを行う場合、-w-C、および -M オプションを組み合わせる必要があるため、面倒なことになります。git log コマンドを使うと、もっと簡単に確認できます。

特定のコードが追加または修正された元のコミットをすべて表示するには、-S オプションを指定して git log を実行します。目当てのコードに -S オプションを付けます。さきほどの README 出力から 1 行選んでサンプルとして使いましょう。README 出力の 12 行目にある「CSS3D and WebGL renderers」というテキストを使います。

$ git log -S"CSS3D and WebGL renderers." --pretty=format:'%h %an %ad %s'
    e339d3c85 Mario Schuettel Tue Oct 13 16:51:06 2015 +0200 reverted README.md to original content
    509c2cc35 Daniel Tue Sep 8 13:56:14 2015 +0200 Updated README
    cb20237cc Mr.doob Mon Dec 31 00:22:36 2012 +0100 Removed DOMRenderer. Now with the CSS3DRenderer it has become irrelevant.

この出力を見ると、3 人の作成者によって README に追加または修正が 3 回加えられたことがわかります。元々は Mr.doob によってコミット cb20237cc に追加されたものでした。このサンプルでは、--pretty-format オプションを追加して git log を実行しています。このオプションを指定することで、git log のデフォルトの出力フォーマットが git log と同じものに変換されます。使用方法と設定オプションの詳細については、git log のページを参照してください。

概要

git blame コマンドを使ってファイルの内容を 1 行ずつ調べて、各行が最後に修正された日時と、誰が修正したのかを確認できます。git blame の出力フォーマットはさまざまなコマンド ライン オプションで変更できます。Bitbucket などのオンライン Git ホスティング ソリューションではブレーム ビューが提供されています。この機能によって、コマンド ラインの git blame の使い勝手が大きく向上しています。git blame と git log を組み合わせて使うことで、ファイルのコンテンツ履歴の検出に役立てられます。git log コマンドにも同じようなブレーム機能がいくつかあります。詳細については git log の概要ページを参照してください。

Git を学習する準備はできていますか?

この対話式チュートリアルを利用しましょう。

今すぐ始める