Gitの --color-moved
オプションで、 移動だけの差分をいい感じに表示する ことができ 、かなり便利だったので紹介してみようと思います。
https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---color-movedltmodegt
ちなみに2年くらい前からあるようですが、最近知りました
https://www.infoq.com/jp/news/2018/04/git-2.17-released
※ 本記事のサンプルでは、Gitのバージョンは2.24.3、シェルはfishを使っています。
サンプル
例えば以下のようなクラスがあった場合。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_settings -> true
else -> super.onOptionsItemSelected(item)
}
}
}
onOptionsItemSelected
を一番上に移動したい、となった場合、オプション無しの diff
だと…
元の位置にあった onOptionsItemSelected
の削除と、新しい位置への onOptionsItemSelected
の追加が表示されることになります。
しかしながら、 diff --color-moved=dimmed_zebra
とした場合は…
移動だけの差分なため、グレーアウトされた表示になります…!(かなりわかりやすい)
さらに便利なところがありまして、ただの移動のつもりが
R.id.action_settings -> true
を
R.id.action_settings -> false
に間違って変えてしまっていた場合は…
移動したところだけはグレーアウト、変更があったところは通常の差分表示、とかなりいい感じに表示してくれます
オプション無しと --color-moved=dimmed_zebra
を付けた時を比べてみると一目瞭然。かなり便利では…!
なし | あり |
---|---|
モードは6つ
サンプルでは dimmed_zebra
を使っていますが、 --color-moved
のモードとしては
no
,default
,blocks
,zebra
,dimmed-zebra
,plain
の6つを指定可能です。( no
はハイライトなし、 default
は zebra
と同じなため、実質4つ。)
個人的には dimmed-zebra
が一番いいのかなと思いますが、 派生元の blocks
には
Blocks of moved text of at least 20 alphanumeric characters are detected greedily.
という条件があり、うまく移動の差分として表示されないケースもあるため、適宜モードを使い分ける必要がありそうです。
終わりに
Gitの --color-moved
オプションで、移動の差分をいい感じに表示できることをご紹介しました。
このオプション自体は2年くらい前からあるようなので、まだまだ知らない便利なオプションがGitにはあるんだなと思いました。