
こんにちは、みみぞうです。
ナビタイムジャパンで『システムや開発環境、チームの改善』を担当しています。
今回はターミナルで動くGitクライアントツール『GitUI』を紹介します。
本稿は以下のいずれかに当てはまるような方をターゲットにしています。
ターミナルで動くGitクライアントツールを探している方
NeovimからシームレスにGitの操作をしたい方
Windowsで使えるGitクライアントツール探しに困っている方
ℹ️Neovimは、Vimをベース拡張性を考慮してモダンな技術で作られたプロダクトです。
GitUIとは
『GitUI』はターミナル上でもGUIのように快適なGit体験を提供するOSSのツールです。
GitUI provides you with the comfort of a git GUI but right in your terminal
公式のREADME では『速度』『メモリ使用量』『安定性』の3点が強みであると紹介されています。
なぜGitUIを使うのか?
ターミナルで動くGitクライアントツールは世の中に多数存在します。その中で私がGitUIを使う理由について、2つ紹介します。
Neovimからシームレスに使える
Gitはプロジェクトの履歴を管理するツールです。そのため、プロジェクトを編集するときに使うエディタやIDEにGitに関する機能が同梱されていることも多いです。
私の場合、基本的にはエディタ/IDEに同梱されているGitの機能を使います。1つのツールで作業が完結し、エディタ/IDEとの連携も期待できるからです。


しかし、ターミナルで作業をするときは違いました。プロジェクトの編集はNeovimで、Gitの操作はターミナルからGitコマンドやGitクライアントツールを使って、という風に別々で行っていました。なぜなら、Neovimで快適に使用できるGitクライアントがなかったからです。
しかし、GitUIがあるなら話は変わります。『fm-nvim』というNeovimのプラグインを使うことで、NeovimからシームレスにGitUIを利用できます。


また、GitUIは機能も充実しており、VSCodeやIntelliJ IDEAと同等の優れた体験を得られます。機能については後ほど紹介します。
Windows環境でもレイアウトが崩れない
先ほど紹介した『fm-nvim』はGitUI専用のNeovimプラグインではありません。他のGitクライアントやそれ以外のツールにも利用できます。それなのに、なぜGitUIを使うことにしたのでしょうか。READMEには『速度』『メモリ使用量』『安定性』の優位性について記載されていました。ただ、私の場合、それは決め手にはなりませんでした。
私がGitUIを使用する最大の理由は『Windows 11 + Windows Terminal + Powershell + Neovim + 日本語』という環境下でGitUIを起動してもレイアウトが崩れないから です。
これまで多くのターミナルUIツールを試してきましたが、上記5つの条件をすべて満たす環境下でレイアウトが崩れなかったものはありませんでした。
GitUIの便利な機能
ここからは、GitUIの便利な機能をスクリーンショットを交えていくつか紹介します。
ワーキングディレクトリの状態確認
どのファイルに差分があるか、ファイルのどこが差分か、ステージングされているファイルはどれかを確認できます。

ステージ/アンステージ
『Enter』を押すと選択されたファイルが丸ごとステージされます。ステージされたファイルを選択し、もう一度『Enter』を押すとアンステージします。

また、ステージ/アンステージはハンク単位や行単位でも可能です。『→』を押すと、選択されているファイルの差分詳細が表示され、点灯している部分がアクティブなハンクです。

『Enter』を押すとアクティブなハンクがステージされますし、『s』を押すと現在行がステージされます。ステージングエリアをかなり細かく管理できます。
ファイルの編集
ステージ/アンステージをしている最中に、対象ファイルを修正したくなることがあります。以下の画面で『e』を押すと、選択しているファイルをエディタで開き編集することができます。


そのまま編集して保存すると、差分内容が更新されて先ほどの画面に戻ります。
コミット
『c』を押すとコミットメッセージの入力欄が表示されます。コミットメッセージを打ち込んで『Enter』を押せばコミットできます。

コミットログの表示
『TAB』または『2』を押すと、タブが切り替わりコミットログ表示画面になります。履歴や詳細情報の確認はもちろんのこと、git resetやgit revertをはじめとした様々な操作ができます。

コマンドとショートカットキー
現在画面で使えるコマンドとショートカットキー
現在画面で使えるコマンドとショートカットキーは、画面の下のほうに表示されています。

グレーアウトされているのは今利用できないコマンドです。今回のリポジトリはリモートに存在しないため『Push』『Fetch』『Pull』は利用できません。
『.』(ピリオド) を押すことですべてのコマンドを表示できます。

各画面で使えるコマンドとショートカットキー
『h』を押すと、各画面で使えるコマンドとショートカットキーをまとめて表示できます。

スクロールするとすべてのコマンドリストを確認できます。一覧をまとめて列挙してみました。
-- Diff -- Add hunk [⏎]Copy [y] Jump up/down [⤒,⤓,↑, Next hunk [n] Prev hunk [p] Remove hunk [⏎] Reset hunk [⇧D] Reset lines [d] Stage lines [s] Unstage lines [s] - Stashing -- Save [s] Stash [⏎] Toggle Staged [i] Toggle Untracked [u]-- Branches -- Branches [b] Checkout [⏎] Compare [⇧C] Create [c] Delete [⇧D] Fetch [⇧F] Merge [m] Rebase [⇧R] Remote [⇥] Rename Branch [r]-- General -- Abort merge [⇧A] Abort rebase [⇧A] Abort revert [⇧A] Back [←] Blame [⇧B] Close [⎋] Close [⎋⏎] Commit [c] Confirm [⏎] Continue rebase [⇧R] Delete [⇧D] Diff [→] Fetch [⇧F] Find [f] Find [f] Force Push [⇧P] Help [h] Inspect [→] Mark [˽] Nav [↑↓] Nav [↑↓→←] Next [⇥] Open Parent [p] Open [⏎] Options [o] Pull [f] Push [p] Quit [^c] Scroll [↑↓] Scroll [↓↑] Submodules [⇧S] Tab [12345] Tags [⇧T] To stage [w] To unstaged [w] Undo Commit [⇧U] Update [u]-- Commit Popup -- Amend [^a] Open editor [^e] Previous Msg [^n] Sing-off [^s] disable hooks [^f] -- Stashes -- Apply [a]Drop [⇧D] Inspect [→] Pop [⏎] -- Changes -- Edit [e] Ignore [i] Reset [⇧D] Stage All [a] Stage [⏎] Unstage [⏎] Unstage all [a] -- Log -- Annotate [^a] Annotation [→] Change Type [↑↓] Checkout [⇧S] Compare Commits [⇧C] Confirm [⏎]Copy Hash [y]Copy Path [y] Details [⏎] Exit Search [⎋] Files [⇧F] Find [f] History [⇧H] Push Tags [p] Reset [⇧R] Revert [⇧D] Reword [r] Search Hash [^j] Select commit [⏎] Tag [t] Tag [⏎] ToggleOption [˽]
このラインナップを眺めるだけでも、GitUIの高機能ぶりが分かりますね。しかも高速で安定しています。
ショートカットキーの変更
key_bindings.ronファイルを作成するとコマンドのショートカットキーを変更できます。公式ドキュメントに記載があります。
たとえば、Windowsで上下左右キーをVimのようなショートカットキーにしたい場合は以下のような%APPDATA%/gitui/key_bindings.ron を作成します。
( move_left:Some(( code: Char('h'), modifiers: ( bits:0,),)), move_right:Some(( code: Char('l'), modifiers: ( bits:0,),)), move_up:Some(( code: Char('k'), modifiers: ( bits:0,),)), move_down:Some(( code: Char('j'), modifiers: ( bits:0,),)))
modifiers のbits には修飾キーを割り当てます。どのキーがどの値に割当たっているかはcrosstermのソースコードを参考にしてください。
pubstructKeyModifiers:u8 {const SHIFT =0b0000_0001;const CONTROL =0b0000_0010;const ALT =0b0000_0100;const SUPER =0b0000_1000;const HYPER =0b0001_0000;const META =0b0010_0000;const NONE =0b0000_0000; }
豆知識
Bad credentialsエラーになる
SSHを利用している場合に、GitUIでリモートが絡む操作 (fetch/pull/push) を行うと、Bad Credentials エラーになり失敗することがあります。公式FAQにも記載があります。
この問題を解消するには『SSHキーをssh-agentに追加する』必要があります。具体的な方法はGitHubの以下ドキュメントをご覧ください。
コミットグラフの対応について
GitUIの履歴画面ではコミットグラフが表示されません。

この履歴、実際には以下のようなコミットグラフになっています。

そのため、コミットグラフを見たいときは別のツールを使う必要があります。個人的なオススメはgit-graphです。
ただ、GitUIはまだバージョン1.0に到達していません。コミットグラフの対応はロードマップにも記載がありますので、今後のリリースを楽しみにしたいと思っています😆
まとめ
ターミナルで動くGitクライアントツール『GitUI』について紹介しました。
GitUIはWindowsやNeovimからの起動でも、動作・レイアウトが安定しています。しかも非常に多機能です。
GUIのエディタやIDEを使える環境であれば、同梱されたGitクライアント機能を使えば快適です。ただ、もしVimやターミナルからGitの操作をしなければならず、Gitコマンドに抵抗があるのであれば、是非GitUIをお試しいただければと思います。
最後までお読みいただきありがとうございました!