📚

Git stashを卒業してGit worktreeしか使わなくなった

に公開

はじめに

こんにちは!KGモーターズ株式会社でエンジニアをしている中村です。

KGモーターズは、広島を拠点に1人乗り小型 EV mibot を開発しているスタートアップです。

最近、CEOから「ちゃんとKGモーターズって言ってる?KGモーター"ス"に聞こえるんだけど」と注意されたことがあり、そんなことあるわけないやろと改めて心の中で言ってみたら「KGモーター"ス"」とナチュラルに言っていたかもしれない中村です。

いよいよ量産直前となっており、気づいたらホームページがすごいオシャレになってました。
多分どこかにすごいデザイナーさんがいるに違いない...

https://mibot.kg-m.jp/

さて今回はGit worktreeについてです。

絶賛リファクタリング中に

  • 急にバグ修正が必要になった
  • 上司から別ブランチの動作確認を求められた
  • 至急Pull Requestのレビューをしてほしいとお願いされた

などなど...開発をしているとだいたい上記に遭遇します。
私はずっとgit stashで退避してから作業を行いますが、「リファクタリング中のデータをstashするの嫌だな」という気持ちの問題もあったり、作業内容やビルドキャッシュが消えるのは地味にキツイです。

(GitHubを触り始めた当初は、別のフォルダにリポジトリをcloneして対応していたこともあります。今考えるとgit worktreeと概念が近いので、多分自分が天才だったのかもしれません)

そんなとき便利なのが、git worktreeです。
この記事では、Git worktreeの操作から、実際のユースケースを紹介します!

Git worktreeとは

ひとことで言うと

通常Gitでは、1つのディレクトリにつき1ブランチしかチェックアウトできません。
しかしgit worktreeを使うと、同じリポジトリに紐づく複数の作業ツリーを用意し、同時に複数ブランチを開発できます。

Worktreeを使わない方法との違い

ナイーブに別フォルダにCloneした場合を比較しましょう。

別フォルダにCloneするやり方 Git worktree のやり方
git clone して別ディレクトリを作る 1リポジトリ内で複数ディレクトリを管理
cloneごとに履歴を複製 .git ディレクトリを共有(軽量)
更新・フェッチが別管理 共通リポジトリなので同期しやすい

別フォルダにCloneする方法と比較するとGit worktreeの優秀さがわかります。
(ディスク使用量をほとんど増やさずに並行開発ができる)

ということで自分は天才ではありませんでした。

AI駆動開発との親和性

最近はAIエージェントによる開発が当たり前になっており、複数のエージェントを同じリポジトリで稼働させることすらあります。
AIを並列で動かすのと、Git worktreeが相性がいいことからここ最近よく聞くようになりました。

(worktreeに特化したMCPまである)

一応Claude CodeでもGit worktreeを使った並列実行が推奨されているようです。
https://code.claude.com/docs/en/tutorials#run-parallel-claude-code-sessions-with-git-worktrees

Git worktreeコマンド紹介

代表的なコマンドを、用途別に紹介します。

新しいワークツリーを追加

git worktree add {作業ディレクトリ} {チェックアウト対象ブランチ}
  • 作業ディレクトリ
    • ex: ../feature-branch
    • 実際のフォルダができる
  • チェックアウト対象ブランチ
    • ex: feature/new-ui
    • どこを基準に枝分かれするか

ブランチが存在しなければ自動作成されます。

ワークツリーの一覧を表示

git worktree list

出力例:

/home/user/project        abcd123 [main]
/home/user/feature-branch 9876def [feature/new-ui]

ワークツリーを削除

git worktree remove {ディレクトリ名}

ユースケース別使用例

例1: リファクタリング中に緊急Bug発生

長期リファクタリング中に、mainブランチへ即時修正が必要になった場合…
リファクタ中ブランチはそのまま

refactor/xxxブランチで絶賛リファクタリング中とします。

git worktree add ../hotfix main

add以降は

  • ../hotfix
    • 新しく作る作業ディレクトリ
    • ワークツリーの場所
  • main
    • このワークツリーでチェックアウトするブランチ

すると、2つのフォルダができています。

$ ls ../  
hotfix         {リポジトリ名}

worktreeのリストも増えています。

$ git worktree list

 git worktree list
{your repo to path}/{リポジトリ名}  9e6de0c [refactor/xxx]
{your repo to path}/hotfix        9e6de0c [main]

そしてこの後はhotfixフォルダに移って開発をすれば良いです。
hotfixフォルダでブランチ一覧を出すと、以下のようになっています。

$ git branch

* main
+ refactor/xxx

worktree addをする時に、mainブランチでチェックアウトしたので、現在のブランチはmainになっていますし、リファクタリング中のブランチrefactor/xxxも含まれています。

開発が終わってworktreeを消したい場合は以下で完了します。

$ git worktree remove ../hotfix

例2: 過去バージョンをデバッグ

これはありがちですが、過去のリリースバージョンと現在のものを比較したい、再現テストをしたいなどの時に使えます。例えば以下のようにツリーを作成します。

git worktree add ../v1.0 release/v1.0

最後に

地味ながらも、ブランチ切り替えのストレスを解消してくれるGit worktreeでした。
開発中に「ブランチ切り替えめんどくさいな」と思ったときは、ぜひgit worktreeを試してみてください!

KGモーターズでは一緒に働くエンジニアを募集しています!
興味がある方はお気軽にご連絡ください!

https://herp.careers/v1/kgmotors/zE9acsUEN2T5

KGモーターズ Tech Blog

Discussion