要点
以下の感じの Git 設定を追加して
[difftool "idea"] cmd = /Applications/IntelliJ\\ IDEA\\ CE.app/Contents/MacOS/idea diff nosplash dontReopenProjects disableNonBundledPlugins $LOCAL $REMOTE [difftool "ideafg"] cmd = /Applications/IntelliJ\\ IDEA\\ CE.app/Contents/MacOS/idea diff $LOCAL $REMOTE
- IDEA を起動せずに
git difftool -d -t idea - IDEA が起動中なら
git difftool -d -t ideafg

周辺情報
Git 設定のバリエーション
実行ファイル
ideaのパス:OS, IDEA Ultimate/Community版のどちらか等で変化します1 2. この記事の動作環境は, macOS Big Sur 11.2.3, IntelliJ IDEA 2021.1.1 Community Edition. 環境によって存在し得る, 別のカスタム起動スクリプト(python?)
/usr/local/bin/ideaと取り違えると, この記事の設定では動作しません.より柔軟な設定:
この記事はシンプルな設定を採用しましたが, Git の設定次第でより柔軟な動作が可能です3 4. シェルスクリプトが使えるので IDEA に依存しなければ大体可能なのかもしれません.
Git Difftool コマンドオプション
-d:ディレクトリ(複数ファイルを一度に)比較します. このオプションがない場合, 差分が存在するファイル名が逐次的に
$LOCAL,$REMOTEに渡され, その回数分 IDEA の起動と停止を繰り返して差分表示します.-t:使用する difftool 名を指定します.
diff.tool,diff.guitool設定を併用して-tなしの実行も可能ですが,-gオプション有無と他の difftool との使い分けを考慮してこの形に落ち着きました.
課題
複数の diff 画面を開けない:
簡単な方法が見つけられませんでした. IDEA の制限なのか複数の IDEA プロセスを起動すると大抵エラーになります. 従ってこの記事では, IDEA を起動しないままか, 単一の IDEA プロセスが起動した状態で, diff 画面を開きます.
比較する時点の表示が分かりにくい:
$LOCAL,$REMOTEの内容,git difftoolの一時的な仮ディレクトリ名をそのまま表示します. 何と何の比較なのか分かりにくいですが, 脳内補完お願いします.
お気持ち
私は普段 CUI の git-client を使いますが, まとまった差分を GUI で表示する機会が最近増えています.
何度も見るなら, 見た目が良さげな IntelliJ IDEA の diff 画面が良い! と思い今回の投稿となりました.
過去の ある案件で標準ツールが IDEA になって自分が慣れずに作業効率悪かったので 経験を下敷きにしています.idea format コマンドだけ拝借してこっそり Vim で開発した
JetBrains はとても良いものを作ってくれました.