difftastic とは
difftastic(コマンドは difft)は構造的な差分ツールです。行を比べる代わりに、両方のファイルを tree-sitter でパースして構文木を作り、実際に変わった構文はどこかを報告します。ブロックのインデントし直し、引数リストの折り返し、閉じ括弧の移動は差分でなくなり、整形の中に埋もれた変数のリネームこそが浮かび上がります。
⚡ difftastic の主な機能
🌳 構文を理解する差分
両側を構文木としてパースし、構造として比較します。整形だけの差分は消え、本当の変更が浮かび上がります。
🧩 30 を超える言語
Rust、Python、TypeScript、Go、C、C++、Java、Ruby、YAML、JSON、HTML、CSS、Markdown など多数。difft --list-languages で拡張子込みの一覧が出ます。
🪟 左右並列でもインラインでも
--display で、左右並列、両側表示、インライン、機械可読な JSON から選べます。
🔗 Git をそのまま置き換え
git の外部 diff コマンドとして動きます。Mercurial、Jujutsu、Fossil でも同じように使えます。
🚦 正直なフォールバック
未知の拡張子、巨大なファイル、パースエラーが多すぎる場合は、失敗する代わりに単語単位のハイライト付き行差分に切り替わります。
🗂️ ディレクトリとコンフリクト
2 つのディレクトリをコマンド 1 つで比較できます。マージコンフリクトのマーカーが入ったファイルを渡せば、コンフリクトを差分として読むこともできます。
apt upgrade を実行するだけで、常に最新版を使い続けられます。
📦 deb.griffo.io からインストールする
ステップ 1: リポジトリを追加する
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
sudo apt updateinstall -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
apt updatesudo apt install extrepo
sudo extrepo enable griffo
sudo apt update🆓 ずっと無料のミラーがあります。 deb-free.griffo.io は、アカウントもサブスクリプションもなしでパッケージをずっと無料で配布しています。上流より最大2か月遅れ、セキュリティ修正は即座に公開されます。現在収録しているのは cliamp、Ghostty、lazydocker、Oh My Posh と Zed です。difftastic は含まれていないため、今日入手する方法は上のリポジトリだけですが、ご要望があれば追加できます。
🧩 extrepo オプションについて。 extrepo は外部リポジトリを扱う Debian 標準のツールです。署名済みメタデータと照合して鍵を検証したうえで、sources ファイルの作成と署名鍵のインストールを代わりに行います。このリポジトリは griffo、ずっと無料のミラーは griffo-free という名前で登録されているので、Debian(bookworm、trixie、forky、sid)では上のコマンドだけで設定は完了です。
extrepo が用意するのは sources ファイルと鍵だけなので、サブスクリプションの認証情報は引き続き /etc/apt/auth.conf.d/deb.griffo.io.conf に書きます。extrepo は Debian のスイート向けメタデータしか公開していないため Ubuntu は対象外です。Ubuntu では sudo または root のコマンドを使ってください。
ステップ 2: difftastic をインストールする
# 最新の difftastic をインストール
sudo apt install difftastic
# インストールを確認
difft --version# 最新の difftastic をインストール
apt install difftastic
# インストールを確認
difft --versionステップ 3: git に組み込む
# 2 つのファイルを直接比較
difft old.py new.py
# あるいは、すべての diff で git に difftastic を呼ばせる
git config --global diff.external difft
# 素の git diff も、フラグひとつで使えます
git --no-ext-diff diff
# man ページはパッケージに同梱されています
man difft🎯 基本的な使い方
ファイルとディレクトリを比較する:
# 2 つのファイルを左右に並べて
difft before.rs after.rs
# 1 カラム表示。従来の diff に近い出力
difft --display inline before.ts after.ts
# 2 つのディレクトリを、変わっていないファイルを飛ばして比較
difft old/ new/ --skip-unchanged --sort-paths
# このビルドが理解する言語は?
difft --list-languagesgit の diff として使う:
# この差分にだけ difftastic を使う
GIT_EXTERNAL_DIFF=difft git diff
# 履歴全体を構造的な差分で
GIT_EXTERNAL_DIFF=difft git log -p --ext-diff
# difftool として登録
git config --global difftool.difftastic.cmd 'difft "$LOCAL" "$REMOTE"'
git difftool --tool difftastic
# 構造的なログのための git エイリアス
git config --global alias.dlog '!GIT_EXTERNAL_DIFF=difft git log -p --ext-diff'出力を調整する:
# コメントだけの変更を無視
difft --ignore-comments a.go b.go
# 文脈を増やし、タブ幅は 2
difft --context 5 --tab-width 2 a.py b.py
# スクリプト向け: 構文上の変更はあったか?
difft --check-only --exit-code a.json b.json
# 環境変数で、毎回の実行の既定値を決める
export DFT_DISPLAY=inline DFT_BACKGROUND=light🔧 ツール連携
difftastic は、すでに差分を見せてくれているツールに組み込めます:
- git:
GIT_EXTERNAL_DIFF、diff.external、difftoolの設定で。--ext-diffを付ければgit log -pやgit showにも効きます - Jujutsu:
jjの diff コマンドに設定すれば、Git 互換のワークフローのまま構文差分が得られます - Mercurial と Fossil: どちらも外部 diff コマンドを受け付けるので、同じバイナリがすべてのリポジトリで使えます
- 環境変数:
DFT_DISPLAY、DFT_BACKGROUND、DFT_WIDTHなどで既定値を一度決めておけます - CI とスクリプト:
--check-onlyと--exit-codeは差分を出さずに「構文は変わったか」に答え、--display jsonは解析されるために用意されています
🚀 deb.griffo.io を選ぶ理由
- 公式 Debian: difftastic をまったくパッケージ化していないので、素のシステムには入れるものがありません
- cargo install difftastic: 最新ではありますが、多数の tree-sitter 文法を含む長いコンパイルの末に apt の外へ置かれ、man ページも付きません
- 上流の tarball: 公式バイナリを、リリースのたびに手でダウンロード
- deb.griffo.io: 最新版を自動更新でお届け
- ✅ 文法も最新: 最新リリースなので、いま書いている言語のバージョンを理解する tree-sitter 文法が入っています
- ✅ apt で入る唯一の場所: difftastic は Debian にも Ubuntu にも収録されていません。このリポジトリが上流公式のビルドをパッケージ化しています
- ✅ 自動更新: 上流のリリースから数時間以内にパッケージを更新
- ✅ 全部入り: 上流のバイナリを
/usr/bin/difftとして、difft.1man ページ付きで - ✅ 2 つのアーキテクチャ: amd64(ライブラリ依存のない静的 musl ビルド)と arm64
- ✅ マルチディストリビューション: Bookworm、Trixie、Forky、Sid で動作
- ✅ 手間のかからない運用: 更新は通常の apt コマンドだけ
📦 パッケージのビルドリポジトリ
Debian パッケージは、この GitHub リポジトリで自動的にビルド・管理されています:
- 🔀 difftastic-debian - 最新リリースのビルド
🔗 関連パッケージ
deb.griffo.io では、こちらも配布しています:
- lazygit - ハンクや行をステージするためのターミナル git UI
- Jujutsu - リベースを一級市民として扱う Git 互換 VCS
- ripgrep - 同じツリーを高速に再帰検索
- Neovim - 差分が指した場所を開くためのエディタ