giff は「ターミナルでdiffを見るのが不十分」という問題に特化した小さなツールです。Rust で書かれ、軽量でありながら、日常のコードレビューやインタラクティブrebaseの場面で十分な機能を備えています。

ターミナルで複雑なマージコンフリクトを処理したり、コミット履歴を整理したりする際、ネイティブの git diff 出力は情報密度が高すぎて、重要な変更を素早く見つけるのが難しいことがあります。giff はより明確な視覚的表現とインタラクティブな設計により、このプロセスをよりコントロールしやすくします。

プロジェクト概要

属性内容
GitHubbahdotsh/giff
Stars241
言語Rust
特徴ターミナルUI、インタラクティブrebaseサポート、軽量高速
最終更新今日

解決する問題

日常の開発で、こうした状況に遭遇することは少なくありません:

  1. PRレビュー前に変更を素早く確認 —— git diff main...feature の出力がターミナルのスクロールに埋もれてしまう
  2. インタラクティブrebaseで間違ったコミットを選択 —— git rebase -i のテキストエディタ体験は初心者には不親切
  3. 2つのブランチの差分を比較 —— 複数ファイル間を移動して確認する必要があり、ターミナルの移動コマンドが思考を中断させる

giff のアプローチはシンプルです:diff情報をより明確なターミナルUIで表示し、キーボード操作の効率性を保ちます。

主な機能

1. ターミナルグラフィカルDiff表示

純粋なテキスト出力とは異なり、giff はターミナルUIフレームワーク(ratatui)を使用してdiffを表示します:

  • サイドバーに変更ファイル一覧を表示
  • メインエリアに選択したファイルの詳細diffを表示
  • シンタックスハイライトで追加/削除/修正を区別
  • 行番号の対照をサポート

このレイアウトは VS Code のdiffビューに似ていますが、完全にターミナル内で動作し、エディタを起動する必要がありません。

2. インタラクティブRebaseサポート

これは giff の差別化機能です。giff --rebase を実行すると:

  • 整理対象のコミットリストを可視化して表示
  • キーボードショートカットでコミット順序を調整(上下移動)
  • pick/squash/drop/reword 操作を素早くマーク
  • 操作後の結果をリアルタイムでプレビュー

featureブランチを頻繁に整理する必要がある開発者にとって、これは git rebase -i のテキスト編集コマンドを覚えるよりも直感的です。

3. 軽量と高速

Rustプロジェクトとして、giff の起動速度とメモリ使用量は適切に制御されています:

  • バイナリファイル約2MB
  • 冷起動時間 < 100ms
  • 大規模diff(100+ファイル)でも目立った遅延なし

ElectronベースのGit GUIツールと比較すると、giff はリモートサーバーやコンテナ環境でより使いやすいです。

4. ゼロコンフィグで開始

インストール後、そのまま使用でき、設定ファイルは不要です:

# 現在のワークスペースとステージングエリアの差分を確認
giff

# 特定コミットの変更を確認
giff <commit-hash>

# 2つのブランチを比較
giff main..feature

# インタラクティブrebaseを開始
giff --rebase

クイックスタート

インストール

macOS / Linux (Homebrew):

brew install bahdotsh/tap/giff

Cargo (Rustパッケージマネージャー):

cargo install giff

プリコンパイルバイナリ: GitHub Releases から対応プラットフォームのバイナリをダウンロードし、PATHに配置してください。

基本の使い方

# ステージングエリアのdiffを確認
giff

# 特定ファイルのdiffを確認
giff -- src/main.rs

# 2つのコミット間の差分を確認
giff abc123..def456

# インタラクティブrebase(現在のブランチ)
giff --rebase

# インタラクティブrebase(範囲指定)
giff --rebase main..HEAD

キーボードショートカット

キー機能
j / 下移動
k / 上移動
Enterファイルの詳細diffを表示
rrebaseモードで reword をマーク
srebaseモードで squash をマーク
drebaseモードで drop をマーク
q終了

類似ツールとの比較

ツールStars特徴適用シナリオ
delta27k+シンタックスハイライト、side-by-side比較git pagerの代替として
gitui18k+完全なGit TUI、staging/blameをサポート日常的なGit操作
lazygit58k+最も機能が充実したターミナルGitクライアント複雑なワークフロー
giff241diff/rebaseに特化、ミニマルデザイン素早いレビュー、コミット整理

giff のポジショニングは「一つのことを行い、それをうまく行う」ことです —— 完全なGitクライアント機能は提供せず、diff表示とrebaseインタラクションという2つのシナリオで深く最適化しています。

適用シナリオ

giff に適している場合:

  • ターミナルワークフローに慣れているが、diff表示体験を改善したい開発者
  • インタラクティブrebaseを頻繁に行ってコミットを整理する必要がある人
  • リモートサーバー/コンテナ環境で作業し、グラフィカルGitクライアントを起動できない場面
  • 起動速度とリソース使用量を重視する軽量ユーザー

あまり適していない場合:

  • 完全なGitクライアント機能(staging、ブランチ管理、remote操作など)が必要なユーザー → lazygit/gituiを使用
  • グラフィカルIDE統合を好むユーザー → VS Code / JetBrainsのGitツールの方が成熟している
  • side-by-sideコード比較が必要なユーザー → deltaの表示効果が優れている

まとめ

giff はワークフローを変えようとするのではなく、特定のシナリオで体験を改善します。git diff の出力が読みにくいと感じたり、git rebase -i のテキスト編集方式が煩わしいと感じたりする場合は、2分かけてgiffをインストールして試してみてください。

241のstarはまだ若いプロジェクトであることを意味しますが、コア機能はすでに使用可能で、今日も積極的に更新されています。このような小さく焦点を絞ったツールは、注目に値します。


属性内容
リポジトリhttps://github.com/bahdotsh/giff
ライセンスMIT
言語Rust
メンテナー@bahdotsh