TechQuant Blog

git-delta で diff が読みやすくなる話 — 設定と日常運用Tips

7分で読める

夜中の2時。50ファイルにまたがる差分をターミナルでレビューしていて、目が完全に死んでいた。緑と赤のフラットな文字列が延々と続く、あの素のままの git diff 画面。「これ、もう少しなんとかならんのか」と独り言を漏らしてキーボードから手を離した、あの夜が delta を入れた直接のきっかけだった。

結論から書く。導入してからレビューに使う時間が、体感で半分くらいになった。誇張ではなく、本当に。シンタックスハイライトと side-by-side 表示が効く差分は、目から脳に入ってくるスピードが違う。

delta って何者なのか

git-delta は Rust で書かれた git の pager。git diffgit 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 を選んでる時間が一番楽しい、ということを伝えておきたい。