git blame
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
の概要ページを参照してください。