Close

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 のロゴ
関連資料

Git チートシート

Bitbucket ロゴ
ソリューションを見る

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 についての継続的な更新をご覧ください。

一面のツールを使ってコラボレーションしている人たち

Bitbucket ブログ

DevOps のイラスト

DevOps ラーニング パス

Demo Den アトラシアン・エキスパートによる機能デモ

Bitbucket Cloud が、Atlassian Open DevOps とどのように連携するか

DevOps ニュースレター購読

Thank you for signing up