Edited at

インデントコミットで真犯人がわからなくなった場合の git blame

More than 3 years have passed since last update.

例えば fluentdlib/fluent/output.rb ファイルに

config_param :queued_chunk_flush_interval, :time, :default => 1

を追加したコミットがどれかを探したいとします。

しかし、git blame を見るとこんなかんじに、インデントコミットによってほぼ全ての履歴が上塗りされていてどれだかわからない、みたいな状況にどうやって真犯人を探そうかという話です。

901fb2ac4a7f791b5d2ad8660fdd5545.png


1. git blame -w を使う

インデントコミットを無視したいだけであれば git blame の -w オプションが使える。-w は比較の際に whitespace を無視してくれるオプション。git diff にもあるよね。

$ git blame -w lib/fluent/output.rb

... (省略)
14d01c71 (Masahiro Nakagawa 2013-03-27 03:56:51 +0900 181) config_param :queued_chunk_flush_interval, :time, :default => 1
... (省略)

おぉ、見つかった。14d01c71 か => https://github.com/fluent/fluentd/commit/14d01c71eb7b0d788184cdd0af6085cdceefa1b8


2. git log -S を使う

git log の -S オプションを使う。-S は指定した文字列にマッチする + diff のある commit log のみ出してくれるオプション。-G で正規表現指定もできる。

$ git log -S 'config_param :queued_chunk_flush_interval, :time, :default => 1' lib/fluent/output.rb

commit 14d01c71eb7b0d788184cdd0af6085cdceefa1b8
Author: Masahiro Nakagawa <repeatedly@gmail.com>
Date: Wed Mar 27 03:56:51 2013 +0900

Add queued_chunk_flush_interval to BufferedOutput

おぉ、見つかった。14d01c71 か => https://github.com/fluent/fluentd/commit/14d01c71eb7b0d788184cdd0af6085cdceefa1b8


3. git-strata を使う

-w オプション実装してくれるっぽいのでちょっと待ってね。


4. vcs-ann を使う

@tanaka_akr さんが vcs-ann というものを作ったと教えてくれたので、試してみた。

w3m で開いて青文字部分のリンクをクリックして、対話的に履歴を追いかけていくことができる!

$ gem install vcs-ann

$ vcs-ann lib/fluent/output.rb

まずは日付をクリック

520935f87f67180dd9e3da4ebcfa3478.png

インデントコミットの差分が出た。今回はインデント前の所を追いたいので - のリンクをクリック

スクリーンショット 2014-04-01 17.09.58.png

次のコミットが出て来たのでまた日付をクリック

64aa5e5dad1a470a2c52eb7cc3ed39b7.png

出て来た!

9b208939c36270ab5fa336d1db844457.png

これは便利なんじゃないですかね?


5. tig blame を使う

@a_matsuda さんに教えてもらいました。tig blame を使えば , で辿れるとのこと。

$ tig blame lib/fluent/output.rb

640391058803a20000762e78fdb12f08.png

最初はインデントコミットのハッシュが出て来たので、カーソル行に対するその前のコミットを

, で辿る。次の blame が出て来た。

c0582d883ad70d5aa82f2000cff6dd91.png

14d01c71 ... コレかな? Enter を押すと diff が見れるので確認。

74b10a9334b8a11a5243b3addc8427de.png

これだ!見つかった!


最後に

もっとありそうな気がするのでコメントウェルカム!