狐好きぷろぐらまー

狐好きプログラマーのブログです。

Git操作のストレスを解消!lazygitで快適なバージョン管理を

こんにちは。 pregum_foxです。

最近tigを使ってGitの操作をしていましたが、最近はlazygitに乗り換えてみて直接gitコマンドを打つ頻度が減ってきました。

この記事では以下の内容を紹介します。

  • lazygitとは
  • なぜlazygitを使うのか
  • lazygitの設定手順
    • 日本語化
    • キーバインドのカスタマイズ
    • 現在の設定ファイルの内容
  • lazygitで操作する方法
    • 基本的なgitコマンド
    • よく使うシナリオ

以下目次です。

この記事を読むことでわかること

  • 日本語でのlazygitの使用方法
  • lazygitのカスタマイズ方法
  • lazygitを用いた日常的なgitの操作方法
  • lazygitからVCS(GitHub)へシームレスに遷移する方法

対象外の内容

  • gitコマンドの詳細
  • 全てのlazygitのコマンド
  • lazygitとGUIツール(SourceTreeやGitKraken等)の違い

想定読者

  • gitの基本的な操作を知っている方
    • ステージング、コミット、ブランチ、リベース、という用語を聞いてなんとなくイメージがつく方であれば大丈夫かと思います。
  • lazygitを使っていないがgitコマンドを打つ頻度が多い方
  • lazygitのカスタマイズ方法を知りたい方
  • lazygitとその他ツールとの違いを知りたい方
  • lazygitでgitを操作する方法を知りたい方
  • ターミナル上でgit操作を試してみたい方

動作確認環境

  • macOS 15.0.1 WindowsやLinuxなどでも使用ができますが、私自身macOSでのみ使用しているため、macOSの前提で記載しています。 対応OSは以下の通りです。

https://github.com/jesseduffield/lazygit?tab=readme-ov-file#installation

以前はWarpを使用していましたが、全角文字が確定されるまで表示されない問題があった為、WezTermに移行しました。

デフォルトのターミナル や iTerm2、 Warpでも操作可能かと思います。

macOSでスタンダードなパッケージ管理ツールです。

WindowsではScoopでインストール可能です。

  • 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ツールです。 マウス操作にも対応しているため、直感的な操作が可能です。

以下のような特徴があります:

  • キーボードショートカットによる素早い操作
  • パネル分割による情報の見やすさ
  • マウス操作のサポート
  • 豊富なカスタマイズ機能
  • 多言語対応(日本語含む)

実際に操作中の動画を添付します。

youtu.be

背景

以前はgitコマンドとtigという別のTUIツールを併用してgitの作業を行っていました。

ただ、ターミナル上からGitHubのページを開くためにghコマンドを叩いたり、複数のリポジトリを切り替えたりする際に、一度tigを閉じたりする必要があり、一部の操作が煩雑になっていることがあり、何か良い解決方法がないかと考えていました。

その時にlazygitを見つけて、色々tigとlazygitを行ったり来たりしながら、lazygitの使い方に慣れていきました。

最初こそgitコマンドを直接叩いたり、tigでブランチ操作をしていたりしましたが、lazygitに慣れてからは全てのgit作業をlazygit上で行うようになりました。

今回は、理解に時間がかかったlazygitのパネルの概念について触れつつ、開発時に普段行っている操作について動画も交えて説明していきます。

lazygitを使用するメリット

lazygitを使用する主なメリットは以下の通りです:

  1. 操作の効率化

    • 細かい操作(1ファイルの内一部分だけステージングする)などがシンプルに操作できる
      • 画面上には実際に実行されたコマンドが表示されるので、lazygitを操作しない場合でも再現可能
    • vimライクなキーボードショートカットで素早く操作可能
    • よく使う操作がメニューとして表示される
  2. 視覚的な情報把握

    • コミット履歴、ブランチ、ステージング状態を一画面で確認可能
    • ファイルの差分が見やすい
    • コンフリクトの解消が容易
  3. いろんな環境に持ち運びやすい

    • ターミナルがあれば、どこでも操作可能
    • テキストベースなので、メモリが少ないPCでもスムーズに操作可能
  4. 他ツールとの連携

    • ターミナルから直接PRの作成画面へ飛べたり、コミット詳細のページへ飛べたりと、シームレスに操作が可能
    • pre-commitやgit-flowのサポートなどがある
  5. かっこいい

  6. 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

このファイルのguilanguagejaに変更することで日本語化が可能です。

gui:
  language: 'ja'

コマンドのpromptなどは英語のままですが、パネル名などは日本語で表示されるようになります。

アイコンの設定

lazygitではファイルやコミットの種類の判別のためにアイコンを表示することができます。

https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#display-nerd-fonts-icons

アイコンの設定は~/Library/Application\ Support/lazygit/config.ymlguinerdFontsVersion3に設定することで使用可能です。

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を使用しています
  • 右側の比較パネルの切り替え
    • 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 --softgit reset --mixedgit 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の設定ファイルを編集するケース

  1. Statusパネル上でeを入力し、設定ファイルを開きます。

新機能の開発を始めるケース

  1. developブランチから新規ブランチを作成
    1-1 Branchesパネルでnを押して新規ブランチを作成

  2. コードの変更とコミット
    2-1. エディタでソースコードを変更
    2-2 c を押してコミットメッセージを入力
    2-3 <enter> を押してコミット

  3. プルリクエストの作成
    3-1. P を押してpushする
    3-2. Branchesパネル上で対象のブランチを選択し、oを押してプルリクエストを作成

youtu.be

コミットした後にコミットメッセージを変えて再度pushするケース

  1. 修正したいコミットを選択し、rを押してコミットメッセージを変更
  2. コミットメッセージを変更後、<shift> + pを押して再度push

youtu.be

コミットした直後にフォーマッタの差分が出ていたので最新のコミットに混ぜ込むケース

  1. Filesパネル上で、混ぜ込みたい変更をステージング
  2. Commitsパネル上で<shift> + aを入力し、最新のコミットに混ぜ込む

youtu.be

切り出し元のブランチが更新されたのでその差分を作業中のブランチにリベース(or マージ) するケース

この例では、developブランチからfeatureAとfeatureBのブランチが切り出され、featureBがマージされた後、developブランチが進んだ分featureAへ差分を取り込むケースです。

操作前の状態の図を貼ります。

リベースの場合

リベース操作後の図を貼ります。

  1. Branchesパネル上で、混ぜ込みたいブランチにチェックアウト
  2. 次に混ぜ込みたいブランチ(develop)にカーソルを合わせて、rを入力しリベース

youtu.be

マージの場合

マージ操作後の図を貼ります。

  1. Branchesパネル上で、混ぜ込みたいブランチにチェックアウト
  2. 次に混ぜ込みたいブランチ(develop)にカーソルを合わせて、<shift> + mを入力しマージ

youtu.be

何らかの作業を行う前に一部分の差分だけstashするケース

  1. Filesパネル上で、差分をステージング
  2. Stashパネル上で<shift> + sを入力し、メッセージを入力
  3. Stash staged changes を選択し <enter>を入力してstash

youtu.be

コミットのURL(or SHA-1)をクリップボードへコピーするケース

  1. Commitsパネル上で、URL(or SHA-1)をコピーしたいコミットにカーソルを合わせてyを入力し、クリップボードへコピー

youtu.be

コミットの順番を入れ替えるケース

Commitsパネル上で操作したいコミットにカーソルを合わせて、<ctrl> + j / <ctrl> + kを入力することでコミットの順番を入れ替えることができます。

  1. Commitsパネル上で、コミットの順番を入れ替えたいコミットにカーソルを合わせて、<ctrl> + j / <ctrl> + kを入力

youtu.be

コミットしないけどデバッグのための変更をpatchファイルとして作成するケース

レビュワーの方に同じ状況を再現してもらうために、デバッグのための変更をpatchファイルとして作成するケースです。

クリップボードに保存する場合
  1. Filesパネル上で、patchファイルとして出力したい箇所以外は<shift> + sでstashへ一時的に退避
  2. 変更差分をyクリップボードへコピー

youtu.be

diff.patchファイルとして作成する場合
  1. Filesパネル上で、patchファイルとして出力したい箇所以外は<shift> + sでstashへ一時的に退避
  2. 任意のパネル上で、:git diff > diff.patch とコマンドを実行し、diff.patchファイルを作成

www.youtube.com

コミットをcherry-pickして、作業中のブランチに適用するケース

  1. Commitsパネル上でcherry-pickしたいコミット範囲の一番上のコミットにカーソルを合わせて、vキーを入力し、範囲選択モードに入る
  2. 範囲選択モードでcherry-pickしたいコミット範囲を選択
  3. <shift> + cを入力し、cherry-pickを行う
  4. Branchesパネル上で、作業中のブランチに切り替える
  5. Commitsパネル上で<shift> + vを入力し、cherry-pickしたコミット群を適用

動画ではfeatureAブランチのコミットをfeature/cherry_pick_testブランチ上にcherry-pickの操作を録画しています。

youtu.be

任意のファイルの変更のうち一部分だけをステージングにアップしてコミットするケース

1行単位でステージングする場合
  1. Filesパネル上で、ステージングしたいファイルにカーソルを合わせて、<enter>を入力し、右側のファイルの差分パネルへ移動
  2. 差分パネル上で、ステージングしたい行を選択
  3. <space>を入力し、ステージング
  4. ステージング操作が完了したら、cを入力し、コミット;

youtu.be

Hunk(差分の塊)単位でステージングする場合
  1. Filesパネル上で、ステージングしたいファイルにカーソルを合わせて、<enter>を入力し、右側のファイルの差分パネルへ移動
  2. 差分パネル上で、aを入力しhunk単位で移動する状態へ移行 2-1. もしくはvキーで任意の範囲を選択できます
  3. <space>を入力し、ステージングを行う

またh, lキーでhunk単位で移動ができたり、,, .で半ページ分移動、<, >キーで最初、最後まで移動ができるのでうまく活用すると素早くステージング・アンステージングが可能ができて便利です。

youtu.be

特定のコミットを削除するケース

  1. Commitsパネル上で操作したいコミットにカーソルを合わせて、dでコミットを削除
  2. ダイアログが表示されるので問題ない場合は、<enter>でコミットを削除

こちらもvキーで範囲選択が可能です。

youtu.be

任意のコマンドをlazygit上で叩くケース

たまにlazygitのキーではできない操作や、コマンドの方が早い操作があったりします。

そんな時は: キーを入力することでコマンドを入力するモードに入ります。

入力後、<enter>を入力することでコマンドが実行されます。

youtu.be

rebase -iで編集モードに入らずにsquashやfixupを行う方法

これもたまに使うのですが、複数コミットが溜まったときに、フォーマッタの変更が複数コミットになった時に変更をわかりやすくするために1つのコミットにまとめたい時があります。

その時は、混ぜ込みたいコミットに対してカーソルを合わせた後、fixup(コミットメッセージを残さずに混ぜ込むオプション)の場合は、fキーを入力することでfixupが可能です。

また、squash(コミットメッセージを残しつつ混ぜ込むオプション)の場合は、sキーを入力することでsquashが可能です。

youtu.be

他のリポジトリへ切り替えるケース

こちらは毛並みが違いますが、複数のリポジトリを切り替えて操作したいときに、Branchesパネル上で<ctrl> + <r>を入力することで直近操作したリポジトリへ切り替えることができます。

youtu.be

まとめ

記事を書くためにショートカットを確認していたりすると、知らない操作があったりするので、?で確認しつつ、キーを覚えていくと良いかと思います。

またTUIなので軽量かつ少ないキー入力で操作ができるので、ぜひ年末年始に操作を覚えて年始のgit操作に活かしてみてください。

ここまで読んでいただき、ありがとうございました。

参考資料