2016/07/25更新

[Git] blameコマンドで特定の行がいつ変更されたのか調べて、バグの混入を見つける

このエントリーをはてなブックマークに追加      

こんにちは、仕事でもプライベートでもGitにお世話になっている@yoheiMuneです。
今日は、git blameというコマンドを使って、特定の行がいつ誰のコミットで変更されたのかを調べる方法をブログに書きたいと思います。「これいつの間に追加されたんだろう〜」というのを調べるのに非常に便利です。

画像

目次




git blameの使いどころ

git blameを使うことで、各行ごとにそれが変更された最終コミットを知ることができます。その機能を利用することで以下のようなユースケースに対応できます。

  • この行バグってるんだけど、誰のいつのコミットで追加されたんだ?
  • このメソッドの引数がいつの間にか拡張されているんだけど、誰がどんな目的で拡張したんだろう?

こんな感じで、特定の行の実装内容が気になった時に、過去を遡ることができます。



git blameコマンド

基本編

早速ですがgit blameコマンドを使うことで、各行が変更された最終コミットを知ることができます。例えば以下のように使います。
$ git blame blog.php
...省略...
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900  26)     // UserAgent
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900  27)     $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900  28) 
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900  29)     // スマホ判定
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900  30)     $isSmartPhone = preg_match("/iphone/",$agent) || preg_match("/android/",$agent);
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900  31)     $isIphone = preg_match("/iphone/",$agent);
6654e0c3 (Yohei Munesada 2016-04-07 13:45:06 +0900  32) 
6654e0c3 (Yohei Munesada 2016-04-07 13:45:06 +0900  33)     // ログ出力(フロントエンド高速化用)
6654e0c3 (Yohei Munesada 2016-04-07 13:45:06 +0900  34)     $uid = uniqid();
6654e0c3 (Yohei Munesada 2016-04-07 13:45:06 +0900  35)     $dt  = date("Y-m-d H:i:s") . "." . substr(explode(".", (microtime(true) . ""))[1], 0, 3);
6654e0c3 (Yohei Munesada 2016-04-07 13:45:06 +0900  36)     $ty  = "start";
...省略...
表示内容としては左から、「最終コミットのハッシュ値」「コミットした人」「コミット日時」「行番号」「行の内容」となっています。これだけでも非常に有効な情報がわかりますね!
ここでコミットのハッシュ値で^がついたものがありますが、これは初期コミットを示します。なのでその行は初期コミットから変更されていないことを意味します。


出力する行の位置を指定する

-Lオプションを使うことで、出力する行を指定することができます。使い方はいくつか存在します。
# 125〜130行目を表示する
$ git blame -L 125,130 blog.php
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900 125)     <?php if ($isSmartPhone) {
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900 126)         #スマホ用スタイル
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900 127)         include "parts/mobile/custom_css.php";
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900 128)     } ?>
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900 129) 
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900 130) 
# 125行目から5行分表示する
$ git blame -L 125,+5 blog.php
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900 125)     <?php if ($isSmartPhone) {
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900 126)         #スマホ用スタイル
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900 127)         include "parts/mobile/custom_css.php";
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900 128)     } ?>
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900 129) 
^23e4b9f (Yohei Munesada 2014-04-25 20:34:28 +0900 130) 
# 正規表現にマッチする行から1行表示する
$ git blame -L /yoheim.css/,+1 blog.php
eedd974b (Yohei Munesada 2016-07-12 13:45:13 +0900 121)     <link rel="stylesheet" href="css/yoheim.css?_=1039" />
と、こんな感じで特定の行を絞り込んで表示することができます。該当箇所発見のスピードアップに効きそうです。



特定のコミットの内容を把握する

git blameで最終コミットがわかったところで、そのコミットが具体的になんだったのかを把握するには、git showを使います。これを使うと具体的な内容を知ることができます。
# 特定のハッシュ値の内容を知る
$ git show 6654e0c3
commit 6654e0c32c7919df7310815e17b502e9a79ce68b
Author: Yohei Munesada <y.munesada@gmail.com>
Date:   Thu Apr 7 13:45:06 2016 +0900

    add a frontend speed measurement tool
 
diff --git a/blog.php b/blog.php
index 166dd53..683fa4f 100755
--- a/blog.php
+++ b/blog.php
@@ -1,5 +1,6 @@
 <?php
     $lang = "jp";
+    date_default_timezone_set('Asia/Tokyo');
        // check query.
        // if there is any illegal query, redirect to NotFoundPage.
        $query = $_SERVER["QUERY_STRING"];
@@ -28,6 +29,17 @@
     // スマホ判定
     $isSmartPhone = preg_match("/iphone/",$agent) || preg_match("/android/",$agent);
     $isIphone = preg_match("/iphone/",$agent);
+
+    // ログ出力(フロントエンド高速化用)
+    $uid = uniqid();
+    $dt  = date("Y-m-d H:i:s") . "." . substr(explode(".", (microtime(true) . ""))[1], 0, 3);
...以下省略...
コミットの詳細を確認して、内容を把握することができます。



git log -Sを使って、特定の行がいつ追加されたのかを知る

git blameだと以下のように、最終コミットだけわかりますが、時にはその行がいつ追加されたのかを知りたい場合があります。その場合にはgit log -S [変更内容] --patch [ファイル名]を使うと、過去の変更を確認することができます。
# blog.php上のyoheim.cssの記述に関する過去の変更を確認する
$ git log -S "yoheim.css" --patch blog.php
commit 23e4b9fa22db0110ce89161dab48fbdbc4d1899c
Author: Yohei Munesada <y.munesada@gmail.com>
Date:   Fri Apr 25 20:34:28 2014 +0900

    Initial Commit

diff --git a/blog.php b/blog.php
new file mode 100755
index 0000000..56c78a2
--- /dev/null
+++ b/blog.php
@@ -0,0 +1,155 @@
+<?php
+    $lang = "jp";
+       // check query.
+       // if there is any illegal query, redirect to NotFoundPage.
この場合、追加されたのは最初のコミットでということがわかります。この辺とかを使いながらバグの特定ができるといいですね!



GithubだとGUIでBlameが見える

GithubにはBlameを使える機能が存在します(僕は最初見たときに何のボタンだろうと思ってましたw)。
ここで「Blame」ボタンを押すことで、以下のように見やすい感じに表示をしてくれます。
これも便利ですね。是非是非活用していきたいところです。



参考資料

今回のブログを書くために以下の記事を参照しました。ありがとうございます。

Git blameを使って効率の良い犯人探し(w - Qiita

transitive.info - git blame 使い方

このコード書いた誰だよ! そんな時の git log -S でもしてみよう | そんなこと覚えてない

Git - Git によるデバッグ

Git - git-blame Documentation(英語)



最後に

今日はGitコマンドについてのブログでした。Gitコマンドは本当に奥が深いですね・・。2年くらい使っていますがまだまだ知らないことがいっぱいです。いろいろと学んでよりスピーディーに開発できるようになれたらと思う今日この頃です。

最後になりますが本ブログでは、開発関連・Swift・Linux・フロントエンド・Python・Java・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。