TerminalでGitを使う際のリアルな問題
git logを叩いて、画面を流れ続けるテキストを眺めながら何を探せばいいか分からなくなった経験はありませんか?あるいはバグ修正の途中、ファイル全体ではなく特定の数行だけをステージしたいのに、git add -pが見づらいdiffを表示して、コンテキストが全くない状態でhunkを一個ずつ聞いてくる、あの感じ。
自分も必要な関数を削除したコミットを探すのに20分近くかかったことがあります。git log --onelineで200件のコミットが並んでいて、どこから始めればいいか分からない。それからgit show abc1234、次にgit show def5678…そんな感じでずっと行き来していました。
5つのファイルで同時にmerge conflictが発生したこともありました。ファイルを一個ずつ開いて、<<<<<<<を探して、手動で修正して、それからcommitする。その作業だけで午前中が丸ごと潰れました。
実際の現場でgit logとgit diffが使いにくい理由
GitはUnix哲学に基づいて設計されています——あるコマンドの出力を別のコマンドにパイプする仕組みです。スクリプティングには効果的ですが、実際の作業では操作性が必要です。スクロール、別のコミットへのジャンプ、追加のコマンドを打たなくてもその場でdiffを確認すること。
GitKrakenやSourceTreeのようなGUIツールはこれを解決してくれます。しかしターミナルを離れる必要があり、SSHでリモートサーバーを操作するdeveloperにとって、それは現実的な選択肢ではありません。
それ以来約8ヶ月間tigを使い続けていますが、GitKrakenを開くことはほとんどなくなりました。
tigとは?
tig(”git”を逆から読んだ名前)はGit向けのtext-mode interfaceです——ターミナル内で完全に動作するTUIで、GUIのように操作できます。以下のことができます:
- スクロールや検索が可能なツリー形式でコミット履歴を閲覧
- 同じ画面内で各コミットのdiffをすぐに確認
- ショートカットキーで特定の行単位でstage/unstage
- working treeの状態やstagedファイルを視覚的に確認
- 明確な色分けでmerge conflictをナビゲート
ターミナルを離れる必要はありません。tig以外に何も追加インストール不要です。
tigのインストール
tigは主要なパッケージマネージャーで利用できます:
# Ubuntu / Debian
sudo apt install tig
# macOS (Homebrew)
brew install tig
# Fedora / RHEL / CentOS
sudo dnf install tig
# Arch Linux
sudo pacman -S tig
インストールの確認:
tig --version
# tig version 2.5.8
コミット履歴の閲覧——読むだけでなく操作できる
gitリポジトリのディレクトリでtigを実行:
tig
画面は上下に分割されます。上部はコミット一覧(git log --graphに似ていますがスクロール可能)、下部は選択中のコミットのdiffです。矢印キーまたはj/kで移動できます。diffはリアルタイムで更新され、追加のコマンド入力は不要です。
tigの基本ショートカットキー
j / k— コミット一覧の上下移動Enter— コミットの詳細diffを開くq— 前のビューに戻る / 終了/— 検索(キーワードを入力してEnter)n / N— 次/前の検索結果へR— 一覧を更新h— ヘルプを開く
特定のファイルのログを確認:
tig -- src/main.py
2つのbranchを比較:
tig main..feature/my-branch
行単位のステージング——git add -pを覚えなくていい
これは自分が最もよく使う機能です。ファイルの中で複数の変更をしているが、一部だけcommitしたい場合——たとえばファイルの先頭でバグを修正したが、末尾には未完成の実験的なコードがある——という時に行(hunk)単位でstageする必要があります。
Status Viewを開く:
tig status
またはtig内でsキーを押します。Status Viewには以下が表示されます:
- Changes to be committed — ステージ済みのファイル/行
- Changed but not staged — 未ステージの変更
- Untracked files — 未追跡の新しいファイル
hunk(コードブロック)単位でステージング
- “Changed but not staged”セクションでstageしたいファイルに移動
Enterを押してそのファイルのdiffを確認- stageしたいhunkに移動
uを押してhunkをstage、または!で破棄
1行単位でステージング
- diff viewでstageしたい特定の行に移動
1を押してその行だけをstage
git add -pとの違いは、stageするかどうかを決める際にファイルの全体的なコンテキストを見ながら判断できる点です。コンテキストなしに盲目的にhunkを一個ずつ聞かれることがありません。ステージング後は通常通りcommitします:
git commit -m "fix: フォーム送信前にemailをバリデーション"
tigでMerge Conflictを解決する
複数のファイルで同時にmerge conflictが発生するのは、最もミスが起きやすい状況の一つです——特に急いでいて、どの部分のコードが「正しい」か分からない時は。同僚のコードを誤って削除したり、古いバージョンを誤って残したりすれば、結果はさらなるデバッグ時間です。
merge conflictが発生したら、tig statusを実行します。conflictのあるファイルはUU(both modified)というマークで表示されます。そのファイルにEnterを押すと、明確に色分けされたdiffを確認できます:
<<<<<<< HEAD
const timeout = 5000;
=======
const timeout = 3000;
>>>>>>> feature/faster-timeout
tigはあなたの部分(HEAD)と別のbranchからの部分を明確に色分けして表示します——vimやnanoでrawテキストを読むよりずっと見やすい。外部エディタでファイルを開いて修正したら、tig statusに戻ります。ファイルがUUからMに変わります。tigの中でuを押してstageし、次に:
git commit # GitがMerge commitのメッセージを自動入力します
tigの他のビューモード
Blame View — 各行のコードを書いたのは誰か
tig blame src/auth.py
各コードの行に、どのcommitがその行を追加/変更したかという情報が表示されます。「この行を誰が変更したのか、どのcommitで、どんなメッセージか?」と確認したい時に最速のビューです。任意のcommitにEnterを押すと、すぐにfull diffを確認できます。
Tree View — 特定のcommitのファイルを閲覧
log viewでtを押すと、選択中のcommitのディレクトリツリーを表示します。各ファイルに移動してその時点での内容を確認できます——削除されたコードを探す時に非常に便利です。
Refs View — すべてのbranchとtagを確認
tig refs
すべてのlocal branch、remote branch、tagを一覧表示します。任意のbranchにEnterを押すと、git checkoutせずにそのbranchのlogをすぐに確認できます。
tigを日常のworkflowに組み込む
~/.bashrcにaliasを設定して使いやすくしています:
# ~/.bashrcまたは ~/.zshrcに追加
alias tl='tig'
alias ts='tig status'
alias tb='tig blame'
tigを使った実際のworkflow:
- コードの修正後、
tsを入力してすべての変更を確認 - 重要なhunkをstage、まだ準備できていない実験的なコードはスキップ
- ステージ済みの部分をわかりやすいメッセージでcommit
- merge/rebase後にconflictがあれば、再度
tsを使って各ファイルをナビゲートして修正 - 古いcommitを探す時は、
tlを実行して/でメッセージやファイル名を検索
tigはgitのコマンドを完全に置き換えるわけではありません——git commit、git push、git rebaseは直接入力する必要があります。しかし最も操作が必要な部分:git log、git diff、git add -p、git blameはtigで十分に代替できます。
SSHでリモートサーバーを操作している方、あるいはgit logの十数個のフラグを覚えたくない方にも、tigはおすすめです。インストールに30秒、ショートカットキーに慣れるのに10分、そして後々かなりの時間を節約できます。

