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
Now that we have a copy of the example code we can start exploring it with git blame
. The state of the example repo can be examined using git log. The commit history should look like the following:
$ 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 チートシート
ソリューションを見る
Bitbucket Cloud での Git の使用方法についてのチュートリアルです。
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 | timestamp 2018-03-01 00:54:03 +0000 | linenumber 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 vs git log
While git blame
displays the last author that modified a line, often times you will want to know when a line was originally added. This can be cumbersome to achieve using git blame
. It requires a combination of the -w
, -C
, and -M
options. It can be far more convenient to use the git log command.
特定のコードが追加または修正された元のコミットをすべて表示するには、-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.
This output shows us that content from the README was added or modified 3 times by 3 different authors. It was originally added in commit cb20237cc by Mr.doob. In this example, git log
has also been prepended with the --pretty-format
option. This option converts the default output format of git log
into one that matches the format of git log
. For more information on usage and configuration options visit the git log page.
要約
The git blame
command is used to examine the contents of a file line by line and see when each line was last modified and who the author of the modifications was. The output format of git blame
can be altered with various command line options. Online Git hosting solutions like Bitbucket offer blame views, which offer a superior user experience to command line git blame
usage. git blame
and git log can be used in combination to help discover the history of a file's contents. The git log
command has some similar blame functionality, to learn more visit the git log overview page.
この記事を共有する
次のトピック
おすすめコンテンツ
次のリソースをブックマークして、DevOps チームのタイプに関する詳細や、アトラシアンの DevOps についての継続的な更新をご覧ください。