こんにちは。 pregum_foxです。
最近tigを使ってGitの操作をしていましたが、最近はlazygitに乗り換えてみて直接gitコマンドを打つ頻度が減ってきました。
この記事では以下の内容を紹介します。
- lazygitとは
- なぜlazygitを使うのか
- lazygitの設定手順
- 日本語化
- キーバインドのカスタマイズ
- 現在の設定ファイルの内容
- lazygitで操作する方法
- 基本的なgitコマンド
- よく使うシナリオ
以下目次です。
- この記事を読むことでわかること
- 対象外の内容
- 想定読者
- 動作確認環境
- lazygitとは
- 背景
- lazygitを使用するメリット
- lazygitの設定方法と使い方
- インストール方法
- 基本的な設定
- よく使うコマンド一覧
- コマンドごとの操作方法
- 実践ケース集
- lazygitの設定ファイルを編集するケース
- 新機能の開発を始めるケース
- コミットした後にコミットメッセージを変えて再度pushするケース
- コミットした直後にフォーマッタの差分が出ていたので最新のコミットに混ぜ込むケース
- 切り出し元のブランチが更新されたのでその差分を作業中のブランチにリベース(or マージ) するケース
- 何らかの作業を行う前に一部分の差分だけstashするケース
- コミットのURL(or SHA-1)をクリップボードへコピーするケース
- コミットの順番を入れ替えるケース
- コミットしないけどデバッグのための変更をpatchファイルとして作成するケース
- コミットをcherry-pickして、作業中のブランチに適用するケース
- 任意のファイルの変更のうち一部分だけをステージングにアップしてコミットするケース
- 特定のコミットを削除するケース
- 任意のコマンドをlazygit上で叩くケース
- rebase -iで編集モードに入らずにsquashやfixupを行う方法
- 他のリポジトリへ切り替えるケース
- まとめ
- 参考資料
この記事を読むことでわかること
対象外の内容
- gitコマンドの詳細
- 全てのlazygitのコマンド
- lazygitとGUIツール(SourceTreeやGitKraken等)の違い
想定読者
- gitの基本的な操作を知っている方
- ステージング、コミット、ブランチ、リベース、という用語を聞いてなんとなくイメージがつく方であれば大丈夫かと思います。
- lazygitを使っていないがgitコマンドを打つ頻度が多い方
- lazygitのカスタマイズ方法を知りたい方
- lazygitとその他ツールとの違いを知りたい方
- lazygitでgitを操作する方法を知りたい方
- ターミナル上でgit操作を試してみたい方
動作確認環境
https://github.com/jesseduffield/lazygit?tab=readme-ov-file#installation
- WezTerm(任意)
以前はWarpを使用していましたが、全角文字が確定されるまで表示されない問題があった為、WezTermに移行しました。
デフォルトのターミナル や iTerm2、 Warpでも操作可能かと思います。
- Homebrew(任意)
macOSでスタンダードなパッケージ管理ツールです。
- lazygit 0.44.1
下記コマンドで確認しました。
lazygit --version commit=611fabde11d24d9acc71ee26077b9a1101f59f27, build date=2024-09-18T10:56:10Z, build source=binaryRelease, version=0.44.1, os=darwin, arch=arm64, git version=2.42.1
lazygitとは
lazygitは、ターミナル上でGitを操作するためのTUIツールです。 マウス操作にも対応しているため、直感的な操作が可能です。
以下のような特徴があります:
- キーボードショートカットによる素早い操作
- パネル分割による情報の見やすさ
- マウス操作のサポート
- 豊富なカスタマイズ機能
- 多言語対応(日本語含む)
実際に操作中の動画を添付します。
背景
以前はgitコマンドとtigという別のTUIツールを併用してgitの作業を行っていました。
ただ、ターミナル上からGitHubのページを開くためにghコマンドを叩いたり、複数のリポジトリを切り替えたりする際に、一度tigを閉じたりする必要があり、一部の操作が煩雑になっていることがあり、何か良い解決方法がないかと考えていました。
その時にlazygitを見つけて、色々tigとlazygitを行ったり来たりしながら、lazygitの使い方に慣れていきました。
最初こそgitコマンドを直接叩いたり、tigでブランチ操作をしていたりしましたが、lazygitに慣れてからは全てのgit作業をlazygit上で行うようになりました。
今回は、理解に時間がかかったlazygitのパネルの概念について触れつつ、開発時に普段行っている操作について動画も交えて説明していきます。
lazygitを使用するメリット
lazygitを使用する主なメリットは以下の通りです:
操作の効率化
- 細かい操作(1ファイルの内一部分だけステージングする)などがシンプルに操作できる
- 画面上には実際に実行されたコマンドが表示されるので、lazygitを操作しない場合でも再現可能
- vimライクなキーボードショートカットで素早く操作可能
- よく使う操作がメニューとして表示される
- 細かい操作(1ファイルの内一部分だけステージングする)などがシンプルに操作できる
視覚的な情報把握
- コミット履歴、ブランチ、ステージング状態を一画面で確認可能
- ファイルの差分が見やすい
- コンフリクトの解消が容易
いろんな環境に持ち運びやすい
- ターミナルがあれば、どこでも操作可能
- テキストベースなので、メモリが少ないPCでもスムーズに操作可能
他ツールとの連携
- ターミナルから直接PRの作成画面へ飛べたり、コミット詳細のページへ飛べたりと、シームレスに操作が可能
- pre-commitやgit-flowのサポートなどがある
かっこいい
- lazygitの使用を決めた最大の理由です。
lazygitの設定方法と使い方
インストール方法
macOSではHomebrewでインストール可能です。
README.mdには、最新を頻繁にアップデートしたい場合はtapを使用するように記載されています。
tap:
brew install jesseduffield/lazygit/lazygit
core:
brew install lazygit
私はcoreを使用しています。
基本的な設定
インストール完了後、lazygitとコマンドを入力することで起動が可能です。
lazygit
最初見るとさまざまなパネルがあって混乱すると思うので説明します。
まず、lazygitには以下の5つの主要なパネルが左側に表示されています。
Status パネル
- こちらに現在のリポジトリ名とブランチ名が表示されます
- 設定ファイルの変更やlazygitのバージョン確認などの操作が行うことができます。
Files - Worktrees - Submodules パネル
- 変更差分があるファイルがこちらに表示されます。
- ファイルに関する操作はこちらのパネルで行います。
[
,]
キーで files - worktress - submodules の表示を切り替えられます。
Local branches - Remotes - Tags パネル
- ブランチに関する操作をこちらのパネルで行います。
[
,]
キーでbranch - remote - tagの表示を切り替えられます。
Commits - Reflog パネル
- コミットログが表示されます。
- コミットに対する操作をこちらのパネルで行います。
[
,]
キーでcommits - reflogの表示を切り替えられます。
Stash パネル
- stashに対する操作をこちらのパネルで行います
vimに置き換えるとパネルがモードのようなイメージです。 特定のパネルに切り替えることで、そのパネルに対応した情報が右側に表示され、操作が可能になります。
パネル間の操作は、vimライク(j, k, h, l)だったり、パネルの左上にある番号(1, 2, 3, 4, 5)を入力することで移動が可能です。
最新バージョンですとターミナルの下部に各パネルのメインの操作キーが表示されるようになっていますので、それを参考にすると良いと思います。
日本語化の設定
lazygitのデフォルトの言語は英語なので、日本語化するためには設定ファイルを編集する必要があります。
lazygitの設定ファイルは~/Library/Application\ Support/lazygit/config.yml
に保存されています。
cat ~/.config/lazygit/config.yml
このファイルのgui
のlanguage
をja
に変更することで日本語化が可能です。
gui: language: 'ja'
コマンドのpromptなどは英語のままですが、パネル名などは日本語で表示されるようになります。
アイコンの設定
lazygitではファイルやコミットの種類の判別のためにアイコンを表示することができます。
https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#display-nerd-fonts-icons
アイコンの設定は~/Library/Application\ Support/lazygit/config.yml
のgui
のnerdFontsVersion
を3
に設定することで使用可能です。
gui: nerdFontsVersion: "3"
nerdFontsを使用する必要があります。
nerdFontsの詳細はここでは割愛しますが、プログラミング用のフォンにアイコンなどのグリフが追加されたフォントです。
詳細はnerdFontsのリポジトリのREADMEを参照してください。 https://github.com/ryanoasis/nerd-fonts/tree/master
nerdFontsはhomebrewでは以下のコマンドでインストール可能です。
brew install font-hack-nerd-font
余談ですが、以前はshowIcons: true
を設定していましたが、deprecatedになっていました。
キーバインドのカスタマイズ
lazygitは~/Library/Application\ Support/lazygit/config.yml
に設定を記述することで、カスタマイズが可能です。
- キーバインド
- フォント
- パネルのサイズ など
cat ~/.config/lazygit/config.yml
よく使うキー操作
どのパネルに関わらず、移動や選択・選択解除などの操作は同じキーが割り当てられています。 以下によく使用しているキー操作を紹介します。
- 選択・選択解除
space
- 一括選択・一括選択解除
a
- 差分パネルではhunk(差分の塊)の選択・選択解除に使用します
- パネルの拡大・縮小
+
_
-
ではなく、_
(Shift +-
)です
- 展開・折りたたみ
enter
- キャンセル ・ 閉じる
q
- 私はlazygitまで閉じてしまうことがあるので、
q
の代わりにesc
を設定してlazygitの終了時はctrl+cを使用しています
- 私はlazygitまで閉じてしまうことがあるので、
- 右側の比較パネルの切り替え
tab
- ステージングされた変更と未ステージングのパネルを切り替える時などに使用します
- キーバインドの確認
?
- 検索
/
- 移動
j
k
h
l
- 大きく移動(ページ単位)
.
,
- 大きく移動(最初のページ/最終ページ)
<
>
- コマンドラインモードの起動
:
- ghコマンドやgit apply、git diff > diff.patchなどを叩くときに使用しています
おすすめの設定ファイル
現在(2024/12/25)私が使用しているlazygitの設定ファイルは以下の通りです。
下記設定を行っています。
- 日本語化
- アイコンの表示設定
- ダイアログを閉じる操作や比較中のパネルから抜ける時のキーとしてESCキーを設定
- lazygitを終了する時のキーとしてctrl+cを設定
- コミット済みのメッセージを編集する時にエラーが出ることがありましたのでそれの解消として
overrideGpg: true
を設定
gui: language: 'ja' nerdFontsVersion: "3" keybinding: universal: quit: '<c-c>' quit-alt1: '' # alternative/alias of quit return: '<Esc>' # return to previous menu, will quit if there's nowhere to return git: overrideGpg: true
よく使うコマンド一覧
ここからはgitで頻繁に行う操作をlazygitで行う方法を紹介します。
はじめにコマンドごとの操作方法を記載します。
コマンドごとの操作方法
git add ~
git add {ファイルパス} | 対象ファイルのステージング
Filesパネル上で対象のファイルにカーソルを合わせて、<space>
を入力することでステージングが可能です。
ステージングされた状態
ステージングされていない状態
git add -A | 全てのファイルのステージング
Filesパネル上でa
を入力することでステージングが可能です。
ステージング前
ステージング後
git commit ~
git commit -m {メッセージ} | コミットメッセージの設定
Filesパネル上でc
を入力することでコミットメッセージの設定が可能です。
git commit --amend | コミットメッセージの修正
Commitsパネル上で編集したいコミットにカーソルを合わせ、r
を入力することでコミットメッセージの修正が可能です。
git commit | 標準エディタでコミットメッセージの設定
Filesパネル上で<shift> + c
を入力することで標準エディタでコミットメッセージの設定が可能です。
git push ~
git push {取得先のremote} {ブランチ名} | ブランチのプッシュ
任意のパネル上で<shift> + p
を入力することでブランチのプッシュが可能です。
pushはカレントブランチに対して動作するため、カレントブランチがpushしたいブランチではない場合は、切り替えてください。
git push --force | 強制プッシュ
通常のpush操作と同じですが、実行前にダイアログで確認されるので、誤操作で強制プッシュしてしまうことを防ぐことができます。
git pull ~
git pull | ブランチのプル
任意のパネル上でp
を入力することでブランチのプルが可能です。
pullの場合は、カーソルがどの位置でもカレントブランチに対してpullが走るので、カレントブランチがpullしたいブランチではない場合は、切り替えてください
pushとpullが同じpキーを使用することが気になる方は、カスタムで別キーに割り当てても良いかと思います。
git checkout ~ (git restore関連)
git checkout . | git restore . | 変更を元に戻す
Filesパネル上で削除対象のファイルを選択して、d
を入力することで変更を元に戻すことが可能です。
戻す前に一度ダイアログが出るので、<enter>
を入力することで削除が実行されます。
git checkout ~ (git switch関連)
git checkout {ブランチ名} | git switch {ブランチ名} | フランチの切り替え
Branchesパネル上で切り替え対象のブランチにカーソルを合わせて、<space>
を入力することでブランチの切り替えが可能です。
現在のブランチは左側に*
マークが付いているブランチであることを覚えておけば、特に困ることはないかと思います。
切り替え前
切り替え後
ブランチ名を検索して対象のブランチを探す場合は、c
を入力することでブランチ名の検索が可能です。
git checkout {リモートに存在するブランチ名} | リモートブランチのチェックアウト
Branchesパネル上で]
キーを入力して リモートタブを選択後、対象のリモートを選択して、<enter>
で、リモートブランチが表示されるので、そこから対象のブランチにカーソルを合わせて、<space>
を入力することでリモートブランチのチェックアウトが可能です。
リモートブランチのチェックアウト時に、ダイアログが出るのでNew local branch
にカーソルを合わせて、<enter>
を入力することでリモートブランチのチェックアウトが可能です。
git branch ~
git branch -d {ブランチ名} | ブランチの削除
Branchesパネル上で削除対象のブランチにカーソルを合わせて、d
を入力することでブランチの削除が可能です。
ローカルブランチとリモートブランチのどちらを削除するかダイアログが表示されるので削除したい方を選んでください。
git merge ~
git merge {ブランチ名} | ブランチのマージ
developブランチにfeatureブランチをマージする場合を例にします。
まずはfeatureブランチにチェックアウト後、Branchesパネル上でdevelopブランチにカーソルを合わせて、<shift> + m
を入力することでブランチのマージが可能です。
ダイアログが表示され項目がいくつか出てきますが、マージコミットについての扱いを設定するものですので、とりあえずマージしたい方は1つ目のRegular merge
を選択して、<enter>
を入力することでマージが実行されます。
git rebase ~
git rebase {ブランチ名} | ブランチのリベース
Branchesパネル上でリベース対象のブランチにカーソルを合わせて、r
を入力することでブランチのリベースが可能です。
シンプルなリベースとインタラクティブなリベースの2つの項目がダイアログに表示されますので、細かい編集が不要な場合は、Simple rebase onto {ブランチ名}
を選択して、<enter>
を入力することでリベースが実行されます。
1コミットだけsquashやfixup、rewordする場合は、Commitsパネル上で操作したいコミットにカーソルを合わせて、s
(squash)やf
(fixup)やr
(reword)を入力することでリベースが実行されます。
fixup
squash
git rebase -i {コミットID or ブランチ名} | 対象のコミット以降のインタラクティブなリベース
Commitsパネル上でリベース対象のコミットにカーソルを合わせて、e
を入力することでリベースのインタラクティブモードに入ります。
その状態ではgitコマンドと同様にdrop, fixup, squash, edit, コミット順の変更などができます。
一通り操作が完了後、実行する場合はm
を入力することでリベースが実行されます。
git reset ~
git reset {コミットID} | 現在のブランチのHEADを移動
Commitsパネル上で操作したいコミットにカーソルを合わせて、g
を入力することで現在のブランチのHEADを移動が可能です。
g
を入力すると、git reset --soft
とgit reset --mixed
とgit reset --hard
の3つのダイアログが表示されるので、それぞれのダイアログを選択して、<enter>
を入力することでリセットが実行されます。
git stash ~
git stash push | ステージングしていない変更をスタッシュ
Filesパネル上でs
を入力することでステージングしていない変更をスタッシュが可能です。
その時のメッセージを入力するダイアログが表示されますので、メッセージを入力して、<enter>
を入力することでスタッシュが実行されます。
git stash pop | スタッシュのポップ(適用後stash一覧から破棄)
Stashパネル上で適用したいスタッシュにカーソルを合わせて、g
を入力することでスタッシュのpopが可能です。
git stash drop | スタッシュの削除
Stashパネル上で削除したいスタッシュにカーソルを合わせて、d
を入力することでスタッシュの削除が可能です。
git stash apply | スタッシュの適用
Stashパネル上で適用したいスタッシュにカーソルを合わせて、<space>
を入力することでスタッシュの適用が可能です。
git stash drop & store | スタッシュメッセージの変更
Stashパネル上で適用したいスタッシュにカーソルを合わせて、r
を入力することでスタッシュのメッセージを変更が可能ですのメッセージを変更が可能です。
git tag ~
git tag {タグ名} | タグの作成
Commitsパネル上で対象のコミットにカーソルを合わせて<shift> + t
を入力することでタグの作成が可能です。
git revert ~
git revert {コミットID} | コミットの取り消し
Commitsパネル上で操作したいコミットにカーソルを合わせて、t
を入力することでコミットの取り消しが可能です。
git cherry-pick ~
git cherry-pick {コミットID} | コミットの適用
Commitsパネル上で操作したいコミットにカーソルを合わせて、<shift> + c
を入力することでコミットの適用が可能です。
コンフリクトの解消
Filesパネル上でコンフリクトしているファイルにカーソルを合わせて、<enter>
を入力することでコンフリクト箇所のどちらの変更を取り込むかを選択できます。
取り込む方を選択後、<enter>
を入力することで選択した変更を取り込むことができます。
両方取り込む場合は、b
キーで両方取り込むことができます。
実践ケース集
lazygitの設定ファイルを編集するケース
- Statusパネル上で
e
を入力し、設定ファイルを開きます。
新機能の開発を始めるケース
developブランチから新規ブランチを作成
1-1 Branchesパネルでn
を押して新規ブランチを作成コードの変更とコミット
2-1. エディタでソースコードを変更
2-2c
を押してコミットメッセージを入力
2-3<enter>
を押してコミットプルリクエストの作成
3-1.P
を押してpushする
3-2. Branchesパネル上で対象のブランチを選択し、o
を押してプルリクエストを作成
コミットした後にコミットメッセージを変えて再度pushするケース
- 修正したいコミットを選択し、
r
を押してコミットメッセージを変更 - コミットメッセージを変更後、
<shift> + p
を押して再度push
コミットした直後にフォーマッタの差分が出ていたので最新のコミットに混ぜ込むケース
- Filesパネル上で、混ぜ込みたい変更をステージング
- Commitsパネル上で
<shift> + a
を入力し、最新のコミットに混ぜ込む
切り出し元のブランチが更新されたのでその差分を作業中のブランチにリベース(or マージ) するケース
この例では、developブランチからfeatureAとfeatureBのブランチが切り出され、featureBがマージされた後、developブランチが進んだ分featureAへ差分を取り込むケースです。
操作前の状態の図を貼ります。
リベースの場合
リベース操作後の図を貼ります。
- Branchesパネル上で、混ぜ込みたいブランチにチェックアウト
- 次に混ぜ込みたいブランチ(develop)にカーソルを合わせて、
r
を入力しリベース
マージの場合
マージ操作後の図を貼ります。
- Branchesパネル上で、混ぜ込みたいブランチにチェックアウト
- 次に混ぜ込みたいブランチ(develop)にカーソルを合わせて、
<shift> + m
を入力しマージ
何らかの作業を行う前に一部分の差分だけstashするケース
- Filesパネル上で、差分をステージング
- Stashパネル上で
<shift> + s
を入力し、メッセージを入力 Stash staged changes
を選択し<enter>
を入力してstash
コミットのURL(or SHA-1)をクリップボードへコピーするケース
コミットの順番を入れ替えるケース
Commitsパネル上で操作したいコミットにカーソルを合わせて、<ctrl> + j / <ctrl> + k
を入力することでコミットの順番を入れ替えることができます。
- Commitsパネル上で、コミットの順番を入れ替えたいコミットにカーソルを合わせて、
<ctrl> + j / <ctrl> + k
を入力
コミットしないけどデバッグのための変更をpatchファイルとして作成するケース
レビュワーの方に同じ状況を再現してもらうために、デバッグのための変更をpatchファイルとして作成するケースです。
クリップボードに保存する場合
- Filesパネル上で、patchファイルとして出力したい箇所以外は
<shift> + s
でstashへ一時的に退避 - 変更差分を
y
でクリップボードへコピー
diff.patchファイルとして作成する場合
- Filesパネル上で、patchファイルとして出力したい箇所以外は
<shift> + s
でstashへ一時的に退避 - 任意のパネル上で、
:git diff > diff.patch
とコマンドを実行し、diff.patchファイルを作成
コミットをcherry-pickして、作業中のブランチに適用するケース
- Commitsパネル上でcherry-pickしたいコミット範囲の一番上のコミットにカーソルを合わせて、
v
キーを入力し、範囲選択モードに入る - 範囲選択モードでcherry-pickしたいコミット範囲を選択
<shift> + c
を入力し、cherry-pickを行う- Branchesパネル上で、作業中のブランチに切り替える
- Commitsパネル上で
<shift> + v
を入力し、cherry-pickしたコミット群を適用
動画ではfeatureAブランチのコミットをfeature/cherry_pick_testブランチ上にcherry-pickの操作を録画しています。
任意のファイルの変更のうち一部分だけをステージングにアップしてコミットするケース
1行単位でステージングする場合
- Filesパネル上で、ステージングしたいファイルにカーソルを合わせて、
<enter>
を入力し、右側のファイルの差分パネルへ移動 - 差分パネル上で、ステージングしたい行を選択
<space>
を入力し、ステージング- ステージング操作が完了したら、
c
を入力し、コミット;
Hunk(差分の塊)単位でステージングする場合
- Filesパネル上で、ステージングしたいファイルにカーソルを合わせて、
<enter>
を入力し、右側のファイルの差分パネルへ移動 - 差分パネル上で、
a
を入力しhunk単位で移動する状態へ移行 2-1. もしくはv
キーで任意の範囲を選択できます <space>
を入力し、ステージングを行う
またh
, l
キーでhunk単位で移動ができたり、,
, .
で半ページ分移動、<
, >
キーで最初、最後まで移動ができるのでうまく活用すると素早くステージング・アンステージングが可能ができて便利です。
特定のコミットを削除するケース
- Commitsパネル上で操作したいコミットにカーソルを合わせて、
d
でコミットを削除 - ダイアログが表示されるので問題ない場合は、
<enter>
でコミットを削除
こちらもv
キーで範囲選択が可能です。
任意のコマンドをlazygit上で叩くケース
たまにlazygitのキーではできない操作や、コマンドの方が早い操作があったりします。
そんな時は:
キーを入力することでコマンドを入力するモードに入ります。
入力後、<enter>
を入力することでコマンドが実行されます。
rebase -iで編集モードに入らずにsquashやfixupを行う方法
これもたまに使うのですが、複数コミットが溜まったときに、フォーマッタの変更が複数コミットになった時に変更をわかりやすくするために1つのコミットにまとめたい時があります。
その時は、混ぜ込みたいコミットに対してカーソルを合わせた後、fixup(コミットメッセージを残さずに混ぜ込むオプション)の場合は、f
キーを入力することでfixupが可能です。
また、squash(コミットメッセージを残しつつ混ぜ込むオプション)の場合は、s
キーを入力することでsquashが可能です。
他のリポジトリへ切り替えるケース
こちらは毛並みが違いますが、複数のリポジトリを切り替えて操作したいときに、Branchesパネル上で<ctrl> + <r>
を入力することで直近操作したリポジトリへ切り替えることができます。
まとめ
記事を書くためにショートカットを確認していたりすると、知らない操作があったりするので、?
で確認しつつ、キーを覚えていくと良いかと思います。
またTUIなので軽量かつ少ないキー入力で操作ができるので、ぜひ年末年始に操作を覚えて年始のgit操作に活かしてみてください。
ここまで読んでいただき、ありがとうございました。