git diff をリッチにする Difftastic の使い方


Difftastic とは

Difftastic は、リッチな diff 表示を行うコマンドラインツールです。

行単位の変更差分ではなく、コードを解析(50超の言語に対応しています)することで、構文ツリーの変更差分を確認できます。


インストール

MacOS の場合は brew から

brew install difftastic

Windows の場合は winget でインストールできます。

winget add difftastic

インストール後は difft コマンドで利用可能となります。

difft --version
Difftastic 0.62.0

ファイル同士の比較は以下のように指定します。

difft sample_files/simple_1.js sample_files/simple_2.js

ディレクトリ同士の比較は以下のように指定します。

difft sample_files/simple_1.js sample_files/simple_2.js

が、通常は Git の diff ツールとして利用することになるでしょう。


Git での設定

エイリアスを登録して使うか、外部 diff ヘルパー difftool に登録して使うかの2つの方法があります。 difftastic をデフォルトの diff ツールとして使うと、path として使いたい時などに --no-ext-diff オプションを指定する必要があったりするので、エイリアス登録して使った方が混乱ないかなと思います。

エイリアス設定

ユーザルート .gitconfig に以下のようにエイリアス設定を行います。

[alias]
    ddiff = -c diff.external=difft diff

以下のように通常の diff の代わりに使うことができます。

git ddiff

git log -p (各コミットで反映された変更点を表示)と、git show(コミットのログメッセージとテキスト差分を表示) でも difftastic による表示を行うことができます。

エイリアス名を短縮して以下のように登録すると良いでしょう。

[alias]
    dl = -c diff.external=difft log -p --ext-diff
    ds = -c diff.external=difft show --ext-diff
    dft = -c diff.external=difft diff

difftool 登録

外部 diff ヘルパー difftool に登録して使う場合は以下のように設定します。

[difftool "difftastic"]
    cmd = difft "$MERGED" "$LOCAL" "abcdef1" "100644" "$REMOTE" "abcdef2" "100644"

[difftool]
    prompt = false

[pager]
    difftool = true

[diff]
    tool = difftastic