Git stashを卒業してGit worktreeしか使わなくなった
はじめに
こんにちは!KGモーターズ株式会社でエンジニアをしている中村です。
KGモーターズは、広島を拠点に1人乗り小型 EV mibot を開発しているスタートアップです。
最近、CEOから「ちゃんとKGモーターズって言ってる?KGモーター"ス"に聞こえるんだけど」と注意されたことがあり、そんなことあるわけないやろと改めて心の中で言ってみたら「KGモーター"ス"」とナチュラルに言っていたかもしれない中村です。
いよいよ量産直前となっており、気づいたらホームページがすごいオシャレになってました。
多分どこかにすごいデザイナーさんがいるに違いない...

さて今回は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を使った並列実行が推奨されているようです。
Git worktreeコマンド紹介
代表的なコマンドを、用途別に紹介します。
新しいワークツリーを追加
git worktree add {作業ディレクトリ} {チェックアウト対象ブランチ}
- 作業ディレクトリ
- ex:
../feature-branch - 実際のフォルダができる
- ex:
- チェックアウト対象ブランチ
- ex:
feature/new-ui - どこを基準に枝分かれするか
- ex:
ブランチが存在しなければ自動作成されます。
ワークツリーの一覧を表示
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モーターズでは一緒に働くエンジニアを募集しています!
興味がある方はお気軽にご連絡ください!
Discussion