git-delta で diff が読みやすくなる話 — 設定と日常運用Tips
夜中の2時。50ファイルにまたがる差分をターミナルでレビューしていて、目が完全に死んでいた。緑と赤のフラットな文字列が延々と続く、あの素のままの git diff 画面。「これ、もう少しなんとかならんのか」と独り言を漏らしてキーボードから手を離した、あの夜が delta を入れた直接のきっかけだった。
結論から書く。導入してからレビューに使う時間が、体感で半分くらいになった。誇張ではなく、本当に。シンタックスハイライトと side-by-side 表示が効く差分は、目から脳に入ってくるスピードが違う。
delta って何者なのか
git-delta は Rust で書かれた git の pager。git diff や git log -p の出力を整形して、コードのシンタックスハイライトを乗せ、行番号を付け、必要なら左右並列の表示にしてくれる。
同じ Rust 製ツール仲間という意味では、以前書いたripgrep の実用Tipsと立ち位置が似ている。「既存ツールの出力を、もっと人間が読みやすくする」という方向性。
標準の git diff と何が違うのか
素の git diff:
- 追加=緑、削除=赤の単色塗り
- シンタックスハイライトなし
- 長い行は折り返しが醜い
delta を通した git diff:
- 言語ごとのシンタックスハイライト(bat と同じ engine)
- 行内の変更箇所だけハイライト(word-level diff)
- ファイルヘッダーが目立つ枠線付き
- side-by-side モードあり
地味だけど、word-level diff が刺さる。「この行どこが変わったんや」と1秒考える時間が消える。
インストール
主要OSでパッケージが用意されている。
# macOS
brew install git-delta
# Debian / Ubuntu (apt は古いことがある)
curl -LO https://github.com/dandavison/delta/releases/latest/download/git-delta_0.18.2_amd64.deb
sudo dpkg -i git-delta_0.18.2_amd64.deb
# Arch
sudo pacman -S git-delta
# cargo (Rust)
cargo install git-delta
自分は Raspberry Pi 5 + arm64 環境だったので、最初 apt で入れたら 0.12 系で word-level diff が動かなくて少しハマった。GitHub Releases の arm64.deb を直接入れて解決。aptのバージョンが古い問題は、Rust 製 CLI だとよくある話で、別記事のripgrepでも同じパターンを踏んだ覚えがある。
~/.gitconfig の設定(実際に使ってるやつ)
自分の手元で動いてる構成をそのまま貼る。コピペで動く。
[core]
pager = delta
[interactive]
diffFilter = delta --color-only
[delta]
navigate = true
line-numbers = true
side-by-side = true
syntax-theme = Monokai Extended
file-style = bold yellow ul
file-decoration-style = none
hunk-header-decoration-style = blue box
minus-style = syntax "#3f1f1f"
plus-style = syntax "#1f3f1f"
[merge]
conflictStyle = zdiff3
ポイントいくつか。
navigate = true
これは便利。pager の中で n / N を押すと、ファイルセクションを前後にジャンプできる。差分が30ファイルとかある時、上下スクロールが消えて精神衛生に良い。
side-by-side
左右並列。横幅の狭いターミナルだと潰れるので、自分はノートPCの横幅ではオフ、外部ディスプレイ接続時はオン、みたいに使い分けたい時もある。後述の features で切替できる。
syntax-theme
delta --show-syntax-themes で全テーマをサンプル付きで一覧できる。これは思わず長居してしまう機能。「Monokai Extended」「OneHalfDark」「TwoDark」あたりがコントラスト強めで読みやすかった。淡い系では「GitHub」も悪くない。
conflictStyle = zdiff3
delta 直接の機能じゃないけど、マージコンフリクト時に「共通の祖先」を表示してくれる git のオプション。delta が綺麗に色分けしてくれるので、コンフリクト解消の精度が上がる。地味に効く。
普段の運用で効いてる小ワザ
features で見た目を切替
features はプリセット名みたいな概念。横幅で切替を仕込んでおくと使い勝手が良い。
[delta]
features = decorations
[delta "decorations"]
side-by-side = true
line-numbers = true
[delta "compact"]
side-by-side = false
line-numbers = true
keep-plus-minus-markers = true
普段は git diff、画面が狭い時は DELTA_FEATURES=compact git diff で一時切替できる。
blame もハイライト
git blame もシンタックスハイライト付きにしたい場合、
[delta]
blame-code-style = syntax
blame-format = "{author:<18} ({commit:>7}) {timestamp:<15}"
これで git blame path/to/file が一気に読みやすくなる。「誰がいつ何を書いたか」を追う作業の体験が変わる。
lazygit との相性
普段ターミナルでの git 操作は lazygit を使っているのだけど、lazygit の diff pager にも delta を仕込める。~/.config/lazygit/config.yml に
git:
paging:
colorArg: always
pager: delta --paging=never --side-by-side
と書くだけ。lazygit の右ペインがちゃんとハイライト付きの side-by-side になる。これに慣れるとブラウザの GitHub UI で diff 見るのが少し物足りなく感じてくる。
ブランチ切替時の差分プレビュー
git worktree でブランチを切って作業することが多いんだけど、別ブランチに切り替える前に「どれくらい差分あるんだっけ」を確認したい時、
git diff main...HEAD --stat
git diff main...HEAD
を delta 越しで見ると、レビュー前の自己チェックの精度が上がる。自分でPRを出す前にもう一度全体を眺める習慣がついた。
正直微妙だった点
絶賛だけだと胡散臭いので、ハマったところも書く。
1つ目。巨大な diff だと描画がもたつく。1万行クラスのバイナリ近い差分を流すと、一瞬固まる。これは bat 由来のシンタックスハイライト処理が重いせい。普段の人間サイズの差分なら全く気にならないが、ライブラリの一括 update みたいな時は --paging=never や --no-gitconfig でフラットに見たほうが早い時もある。
2つ目。ターミナルのカラースキームと喧嘩することがある。背景がライトテーマなのに Monokai Extended を当ててると、ハイライトが浮いて読みにくい。最終的に「starship のカラーパレット」「ターミナルの背景」「delta の theme」を揃えるところまでチューニングしてしまった。沼。
3つ目。CI のログには使えない(当然だけど)。GitHub Actions のログにそのまま出すと ANSI コードが残って汚い。CI で使うなら delta --color-only ではなく素の git diff を使うか、--no-gitconfig で迂回する。
VPS や別マシンへの持ち込み
家の Raspberry Pi で快適になった環境を、外部の VPS にもそのまま持っていきたくなった。chezmoi で .gitconfig を管理しておけば、どの VPS でも chezmoi apply 一発で delta の設定まで反映される。ちなみに自分は実験用のサーバをお名前.comの高性能VPS
で1台借りていて、そこにも同じ delta 環境が入っている。dotfiles の威力が一番感じられる瞬間だ。
結局、入れる価値はあったか
ある。少なくとも自分には刺さった。
git の出力を拡張するツールはたくさんあって、最初は「pager 1個でそんな変わるか?」と懐疑的だった。実際使ってみると、word-level diff と side-by-side の組み合わせは思った以上に脳の負荷を下げる。レビューが面倒で後回しにしていたPRに、すぐ取りかかれるようになった。これは生産性として地味だけど、確実に効いている変化だと思う。
もう一つ。delta は git 以外の diff 出力にも使える。diff -u a.txt b.txt | delta でファイル比較もハイライトされるし、kubectl diff の出力を delta に流すこともできる。Kubernetes で manifest の差分を確認する時、これが結構効く。
このブログでは Rust 製 CLI ツールの記事をいくつか書いているけど、delta は中でも「日常の体験を変える度」が高いほうだ。git を毎日触る人なら、夕方の30分くらいで設定して試してみる価値はある。あとは syntax-theme を選んでる時間が一番楽しい、ということを伝えておきたい。