lazygitに乗り換えて半年。Git作業が3倍速くなった実用テクニック集
金曜の夜、リベース中にコンフリクトが3ファイル同時に出た。git statusを打って、git diffを打って、エディタを開いて、git add -pを打って…という旧来のフローを30分続けた末、ついに諦めてlazygitを起動した。同じ作業が、たぶん5分で終わった。
あれから半年。CLIに戻る気は完全になくなった。
この記事は、lazygitを毎日使い倒している自分が「これは効いた」と思った操作とワークフローだけを書く。公式ドキュメントの翻訳ではなく、現場でぶつかって覚えたものだけ。
lazygit とは何か(CLI派が一番気になる部分)
lazygitは Jesse Duffield 氏が Go で書いた、Git のターミナルUIだ。マウスは要らない。キーボードだけで、ステージング・コミット・プッシュ・リベース・チェリーピックを完結できる。
「TUI?ふーん」で終わる人も多い。自分も最初はそうだった。gitコマンドは指が覚えてるし、わざわざラッパーを噛ませる意味がわからなかった。
ところが実際に触ると、理屈が変わる。差分を見ながら、その場で操作できるのだ。
- 変更ファイル一覧 → カーソルを当てると右に diff が出る
spaceでステージ、cでコミットPでプッシュ、pでプル- コミット履歴の任意の位置で
eを押すとリベースが始まる
「コマンドを覚える」のではなく「画面を見て直感的に操作する」感覚に近い。Sourcetree や GitKraken をターミナルで再現したような体感、と言うとイメージしやすいかもしれない。
インストール:macOS / Linux / Raspberry Pi
パッケージマネージャから入る。Homebrew がある人はこれだけで終わる。
brew install lazygit
Linux 系なら、Ubuntu/Debian は PPA、Arch は pacman、Fedora は dnf copr が用意されている。Raspberry Pi 5(arm64) でも普通に動く。自分は Raspberry Pi 5 のホームサーバーでも入れていて、SSH 越しのコミット作業がこれで完結する。
# Ubuntu 系
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_arm64.tar.gz"
tar xf lazygit.tar.gz lazygit
sudo install lazygit /usr/local/bin
正直、ここはパッケージで入る環境なら何でもいい。バージョンの差で操作キーが変わることはあまりない。
最初に覚えるキー5つと、実戦で効くワークフロー3選
キーバインドは公式に山ほどある。実用度の高い順に5つだけ並べる。
キー操作 5 つ(これだけで生活が変わる)
spaceステージ / アンステージ:ファイル単位はもちろん、enterでファイルを開いた後の行単位ステージにも同じspaceが使える。git add -pの Y/n 地獄から解放される。cコミット:C(大文字)にすると$EDITORが立ち上がってマルチライン編集ができる。Aは amend(直前のコミットに追加)。P/pプッシュ / プル:大文字小文字の対応関係は、慣れるとリズムで覚える。zundo:これは知らないと損する。直前の操作(コミット、ステージ、リベース、ハードリセット…)を取り消せる。git reflogを頭の中でやってくれる感じだ。?ヘルプ:各パネル(Files / Branches / Commits / Stash)で押せる文脈ヘルプ。困ったら?を打つ、というルールを決めると、学習コストが体感半分になる。
ワークフロー1:途中までの作業を別ブランチに退避
「あれ、これ master でやっちゃった」案件、ある。lazygit なら 3 ストロークで救える。b でブランチパネルへ、n で新規ブランチ作成、名前を入れて Enter。これだけ。Stash すら要らない。
ワークフロー2:インタラクティブリベースの fixup を爆速化
これが個人的に一番効果が大きかった。コミット履歴のパネルで、潰したいコミットにカーソルを置いて f を押すだけで fixup マークが付く。r で reword、d で drop、s で squash。最後に上のコミットで m(または e)を押してリベース完了。
CLIで git rebase -i HEAD~5 → エディタで pick を fixup に書き換え → :wq、を毎回やってた頃の自分に教えてあげたい。
ワークフロー3:特定コミットだけを別ブランチへチェリーピック
コミットパネルで対象コミットに c でコピー。ブランチパネルで対象ブランチへ space で切替。コミットパネルで v を押して貼り付け。「ホットフィックスの 1 コミットだけを stable ブランチに持っていく」みたいな作業が、頭で考える時間ゼロで終わる。
カスタム設定とハマったポイント
設定は ~/.config/lazygit/config.yml に書く。デフォルトでも十分使えるが、いくつか変えると体感がさらに良くなる。
gui:
theme:
activeBorderColor:
- green
- bold
inactiveBorderColor:
- white
showFileTree: true
showCommandLog: false
scrollHeight: 4
git:
paging:
colorArg: always
pager: delta --paging=never
autoFetch: true
autoRefresh: true
keybinding:
universal:
quit: 'q'
return: '<esc>'
delta をページャに指定すると、diff が圧倒的に読みやすくなる。showCommandLog: false で下部の実行ログを隠すと、画面が広くなって作業効率が上がる。ここは好みだが、自分は隠す派。
ターミナルのフォントが等幅でないと罫線が崩れる罠もある。等幅フォント、これは譲れない。
半年使って「あれ?」となった点もある。正直に書く。
- 巨大リポジトリで起動が遅い:数万コミット級になると、初回フェッチに数秒かかる。モノレポでは
autoFetch: falseにして、必要な時だけfでフェッチするようにした。 - サブモジュールの扱いが地味:一応パネルはあるが、複雑な操作は CLI のほうが早い。完全には置き換わらない。
- Worktree の操作は最近やっと慣れてきた:
wパネルで作れるが、ブランチとの関連が直感的でない。ここは正直まだ試行錯誤中。
とはいえ全体としては、git CLI を直接叩く時間が 8 割以上減った。日常作業の速度は感覚で 3 倍。
tig / GitUI / Magit との違いと、サーバー側での運用
同じ TUI 系の Git ツールはいくつかある。それぞれの立ち位置を一行で書く。
- tig:閲覧主体。コミット履歴を眺めるのに最適。書き込み操作は弱い
- GitUI:Rust 製で軽量。lazygit と機能はほぼ同じ。好みで選ぶレベル
- Magit:Emacs 民の聖域。Emacs を使ってないと意味がない
- lazygit:書き込み操作のしやすさで頭一つ抜けている
自分が lazygit を選んだ理由は、リベースとチェリーピックの操作が一番速かったから。閲覧だけで良い人は tig でいい。
ローカルだけでなく、VPS やレンタルサーバー上で SSH 接続して直接 git を叩く運用をしている人もいると思う。lazygit は SSH 越しでも普通に動く。GitHub Actions のセルフホストランナーや、デプロイ先のサーバー上での hotfix 作業でも便利だ。
ちなみに自分のメインの VPS はお名前.comの高性能VPS
で、Ubuntu 22.04 + lazygit という構成。リモートでもローカルと同じ操作感で git を扱えるのは、想像以上に楽だ。
自動化との相性も悪くない。lazygit は対話型なので CI には直接は出てこないが、push 前に diff を眺める習慣がつくと、無駄なリトライが減る。GitHub Actions の Python CIを組んでいる人や、cron から systemd timer に移行した環境でジョブ定義のリポジトリを管理している人には、特に刺さるはず。普段使いのターミナルツールをまとめたDevTools コレクションもよかったらどうぞ。
まず触ってみる、それで合わなければ戻ればいい
新しいツールに乗り換えるコストって、心理的なものが大きい。「指が覚えたコマンドを捨てるのが怖い」という気持ちはよくわかる。
でも、lazygit は q で抜ければ普通に git コマンドに戻れる。共存できる。最悪、合わなければ brew uninstall すれば数秒で消える。
導入リスクは限りなくゼロに近い。リターンは、自分の場合、半年で「もう CLI には戻れない」レベルになった。
あ、もう一つ。git status を一日に何回打っているか、一回数えてみると面白い。自分は数えるのを諦めた。lazygit の起動画面は、そのstatusを常に表示している、と思えばいい。
その差は、たぶん想像より大きい。