git blame コマンドは汎用的なトラブルシューティングユーティリティで、さまざまな用途に使用できます。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  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  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  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  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 作成者 タイムスタンプ 行番号 行の内容
89feb84d Albert So 2018-03-01 00:54:03 +0000 3 This repository is an example of a project with multiple contributors making commits.

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

よく使われるオプション

 git blame -C 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 blame では行を最後に修正した作成者が表示されますが、最初に行が追加されたのがいつなのかを確認したくなることがよくあります。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 を学ぶ準備はできていますか?

この対話式のチュートリアルをお試しください。

今すぐ始める