Lazygit に乗り換えた理由
以前、force push をブランチ違いでやらかして大切なコードを失ったことがある。コマンドを打つのが速すぎて、今いるブランチを確認せずに実行してしまい、チームメイトのコミットが丸ごと上書きされてしまった。その日から、Git のワークフローを「ゆっくり見える化する」方法を探し始めた。コマンドを減らしたいわけじゃない — 取り消しのきかない操作をする前に、ちゃんと見えるようにしたかったのだ。
そんなタイミングでちょうど Lazygit に出会った。Git を置き換えるものではなく、Git の上に乗るインターフェース層として、すべてをターミナル内に表示してくれる。各操作の完全なコントロールは手放さずに済む。
Lazygit とは何か、他の GUI ツールとどう違うのか
Lazygit は Go 製の Git 向け TUI(Terminal User Interface)だ。バイナリのサイズはわずか約 7MB で、追加の依存関係は不要。GitKraken や Sourcetree のようなデスクトップ GUI との最大の違いは、完全にターミナル内で動作する点だ — VPS に SSH でログインして lazygit と打つだけで、普通に作業できる。
マウス不要。ターミナルを離れる必要なし。数コミットをまとめたいだけなのに git rebase -i HEAD~5 の構文を覚える必要もない。
Lazygit は画面を複数のパネルに分割して表示する:
- Files — 変更ファイル一覧(staged/unstaged)
- Branches — ローカル・リモートのブランチ一覧
- Commits — スクロール・操作可能なコミット履歴
- Stash — スタッシュエントリ一覧
- Log/Graph — 視覚的なコミットグラフ
Lazygit のインストール
Ubuntu / Debian
LAZYGIT_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazygit/releases/latest" | grep -Po '"tag_name": "v\K[^"]*')
curl -Lo lazygit.tar.gz "https://github.com/jesseduffield/lazygit/releases/latest/download/lazygit_${LAZYGIT_VERSION}_Linux_x86_64.tar.gz"
tar xf lazygit.tar.gz lazygit
sudo install lazygit /usr/local/bin
macOS (Homebrew)
brew install lazygit
Arch Linux
sudo pacman -S lazygit
インストール後、任意の Git リポジトリに移動して以下を実行:
lazygit
パネル分割されたインターフェースが表示されれば完了だ。? を押すとすべてのキーバインドを確認できる。
よく使う機能
1. ファイル全体ではなく行単位でステージング
個人的に最も気に入っている機能だ。git add -p で y/n を繰り返す代わりに、Lazygit では:
- Files パネルでファイルを選択
- Enter で diff ビューを開く
- 矢印キーでステージしたい行に移動
- Space で行単位のステージング、または v で範囲選択してから Space
同じファイルを複数箇所変更していて、一部だけコミットしたいときに非常に便利だ — たとえば上部のバグ修正はコミットしたいが、下のリファクタリング部分はまだコミットしたくない、といったケースに役立つ。
2. コマンドを覚えずにインタラクティブリベース
以前はコミットをまとめるたびに git rebase -i HEAD~3 と打ち、エディタを開いて pick を squash に書き換えて保存する — 2コミットをまとめるだけで30秒かかっていた。Git Interactive Rebase の操作も、Lazygit なら:
- Commits パネルに移動(数字キー 4 またはクリック)
- 操作したいコミットを選択
- s で上のコミットに squash、または r でリネーム
コミットの順番を変えたいときは Ctrl+j / Ctrl+k で直接上下に移動できる — vim でテキストファイルを手作業で編集するより圧倒的に直感的だ。
3. 視覚的な Cherry-pick
別のブランチからコミットを取り込みたい場合、Git Cherry-pick のコマンドを覚えなくても Lazygit では:
- Branches パネルでソースブランチに切り替え
- Commits パネルで取り込みたいコミットを選択
- c でコピー(cherry-pick)
- ターゲットブランチに戻り、v でペースト
Lazygit は cherry-pick 対象のコミットを別の色でハイライト表示する — 確定する前に自分が何をしているか正確に把握できる。
4. スタッシュの管理が楽になる
stash@{2} が何だったか忘れてしまった経験はないだろうか。Stash パネルはすべてのエントリをメッセージ付きで一覧表示し、その場で diff のプレビューも確認できる。Space で apply、g で pop、d で削除 — Git Stash のコマンドを手探りで打つより断然スッキリしている。
5. より安全な Force Push
force push のミスでコードを失ってから、この操作には非常に慎重になった。Lazygit には force push with lease 機能がある — push 時に P の代わりに Shift+P を押す。これは --force ではなく --force-with-lease を使用するため、リモートに他の人の新しいコミットがない場合のみ force push が実行される。キー一つ増えるだけで、過去に自分が経験したような事故を防げる。
最初に覚えておくべきキーバインド
Lazygit には数十のキーバインドがあるが、最初はこれだけ覚えておけば十分使いこなせる:
Space — ファイルまたは行をステージ/アンステージ
Enter — 行単位ステージのためにファイルを開く / 詳細表示
c — コミット(メッセージ入力フォームを開く)
P — リモートにプッシュ
p — リモートからプル
b — 新しいブランチを作成
Shift+M — 選択中のブランチを現在のブランチにマージ
R — 現在のブランチを選択中のブランチにリベース
q — Lazygit を終了
? — 現在のパネルのキーバインドをすべて表示
日常のワークフローへの組み込み
素早く起動できるようにGit Alias を設定している:
# ~/.bashrc または ~/.zshrc に追加
alias lg='lazygit'
もう一つ便利なのは、別のターミナルでファイルを変更すると Lazygit が自動的にリロードされる点だ。tmux の一つのペインで Lazygit を開いたまま、別のペインで作業する — 状態がリアルタイムで更新されるため、手動でリフレッシュする必要がない。
Neovim を使っているなら、lazygit.nvim プラグインでエディタ内のフローティングウィンドウからキーバインド一発で Lazygit を開ける。
それでも素の Git コマンドを使うべき場面
Lazygit がすべてのケースをカバーしているわけではない。以下の場面では直接コマンドを打っている:
- Git bisect — Lazygit にはまだ専用の UI がない(git bisect についてはブログの別記事を参照)
- 複雑なサブモジュール — 基本的なサポートはあるが完全ではない
- カスタムフックや特定の出力が必要なスクリプト
- スクリプト / CI — Lazygit はインタラクティブツールのため、パイプラインには不向き
Git の基礎を理解していることは依然として重要だ — Lazygit はあくまで操作を速くするための UI 層であり、Git の仕組みそのものの理解を代替するものではない。
まとめ
Lazygit を毎日使い続けて数ヶ月が経ち、気づいたことがある。コミットの頻度が上がり、コミットが小さく明確になった — 行単位のステージングとコミットメッセージの入力が驚くほど簡単になったからだ。これは以前からやるべきだとわかっていたことで、Lazygit はそれを「面倒くさい」と感じさせなくしてくれた。
rebase や cherry-pick のたびに Stack Overflow からコマンドをコピペしているなら、一週間だけ Lazygit を試してみてほしい — おそらく元の方法には戻りたくなくなるはずだ。
