株式会社シンシアでは、実務未経験のエンジニアの方や学生エンジニアインターンを採用し一緒に働いています。
※ シンシアにおける働き方の様子はこちら
シンシアでは、年間100人程度の実務未経験の方が応募し技術面接を受けます。その経験を通し、実務未経験者の方にぜひ身につけて欲しい技術力(文法)をここでは紹介していきます。
はじめに
Claude Code、Cursor、Aider、Cline、Devin...
2024年から2025年にかけて、AIコーディングエージェントが急速に普及しました。これらのツールを使い始めて、「開発速度が爆速になった」と感じている人は多いはず。
でも、こんな経験はありませんか?
- AIエージェントに作業を任せている間、自分は待っているだけになる
- 「feature-Aの作業中にhotfixの依頼が来て」集中が途切れる
-
stash → checkout → 作業 → checkout → stash popのブランチ切り替えが面倒
AI時代の開発ボトルネックは「コードを書く時間」から**「待ち時間」と「切り替えコスト」**に移行しています。
この記事では、git worktreeの基本と、それをさらに使いやすくするgit-worktree-runner (gtr) というツールを紹介します。
対象読者
- Claude Code、Cursor、AiderなどAIコーディングエージェントを使っている開発者
- 複数タスクのブランチ切り替えにストレスを感じている人
- 1人で複数案件を効率的に回したい人
Part 1: git worktreeを理解する
git worktreeとは
1つのリポジトリで、複数のブランチを別々のディレクトリで同時に開ける機能です。
Git 2.5(2015年7月リリース)で追加された、実は10年近く前からある機能。しかし、知名度が低く「知る人ぞ知る」状態でした。
なぜ今まで流行らなかったのか
- 素のコマンドが冗長で使いにくい
- 1人で複数ブランチを同時に作業するニーズが少なかった
- IDEのGit統合が進み、ブランチ切り替えで十分だった
# 素のgit worktreeコマンド(長い...)
git worktree add ../my-app-worktrees/feature-a feature-a
git worktree add ../my-app-worktrees/hotfix-123 hotfix-123
git worktree list
git worktree remove ../my-app-worktrees/feature-a
なぜ今、注目されているのか
AIコーディングエージェントの登場で状況が変わりました。
| 従来の開発 | AI時代の開発 |
|---|---|
| 1人1タスクが基本 | AIに任せて並列化が可能 |
| コードを書く時間がボトルネック | 待ち時間・切り替えコストがボトルネック |
| ブランチ切り替えで十分 | 物理的に分離したい |
AIエージェントは「自律的に作業を進めてくれる」ので、人間が複数のAIを同時に走らせることが現実的になりました。そのためには、ブランチごとに独立したディレクトリが必要。そこでgit worktreeが再評価されています。
従来のやり方との比較
| 状況 | 従来のやり方 | git worktreeを使う場合 |
|---|---|---|
| feature-A作業中にhotfix依頼 | stash → checkout → 作業 → checkout → stash pop | 別ディレクトリで即作業開始 |
| 2つの案件を並行作業 | 頻繁にブランチ切り替え | 2つのディレクトリを開いておく |
| AIに任せながら他の作業 | 終わるまで待つ | 別ディレクトリで自分は別作業 |
ディレクトリ構成イメージ
~/projects/
├── my-app/ # メインのリポジトリ (mainブランチ)
└── my-app-worktrees/ # worktree用ディレクトリ
├── feature-a/ # feature-aブランチ ← 自分が作業中
└── feature-b/ # feature-bブランチ ← AIエージェントが作業中
ポイント: 全部同じリポジトリを共有しているので、.gitは1つだけ。コミット履歴も共有されます。
素のgit worktreeコマンド
# worktree作成(既存ブランチ)
git worktree add ../my-app-worktrees/feature-a feature-a
# worktree作成(新規ブランチ)
git worktree add -b feature-b ../my-app-worktrees/feature-b
# 一覧表示
git worktree list
# worktree削除
git worktree remove ../my-app-worktrees/feature-a
# 不要なworktree情報をクリーンアップ
git worktree prune
Part 2: git-worktree-runner (gtr) で効率化
gtrとは
素のgit worktreeコマンドは冗長で使いにくい。
git-worktree-runner (gtr) は、CodeRabbit社が開発したgit worktreeのラッパーCLIツールです。worktreeの操作をシンプルにし、エディタやAIツールとの連携機能を提供します。
GitHub: https://github.com/coderabbitai/git-worktree-runner
gtrの主な機能
| 機能 | 説明 |
|---|---|
| シンプルなコマンド |
git gtr new feature-a で作成完了 |
| エディタ連携 |
git gtr editor feature-a でCursor/VS Codeで開く |
| AIツール連携 |
git gtr ai feature-a でClaude Code/Aider等を起動 |
| 設定ファイル自動コピー |
.envなどを新しいworktreeに自動コピー |
| フック機能 | worktree作成後にnpm installを自動実行など |
素のコマンドとの比較
| 操作 | git worktree | gtr |
|---|---|---|
| 作成 | git worktree add ../repo-wt/feat feat |
git gtr new feat |
| エディタで開く | cd ../repo-wt/feat && cursor . |
git gtr editor feat |
| AIツール起動 | cd ../repo-wt/feat && claude |
git gtr ai feat |
| 一覧 | git worktree list |
git gtr list |
| 削除 | git worktree remove ../repo-wt/feat |
git gtr rm feat |
インストール方法
# リポジトリをクローン
git clone https://github.com/coderabbitai/git-worktree-runner.git
cd git-worktree-runner
# PATHに追加(シンボリックリンク)
sudo ln -s "$(pwd)/bin/git-gtr" /usr/local/bin/git-gtr
初期設定
# デフォルトエディタを設定(Cursorの場合)
git gtr config set gtr.editor.default cursor
# デフォルトAIツールを設定(Claude Codeの場合)
git gtr config set gtr.ai.default claude
# worktree作成後に自動実行するコマンド(任意)
git gtr config add gtr.hook.postCreate "npm install"
対応しているAIツール
| ツール | 設定値 |
|---|---|
| Claude Code | claude |
| Aider | aider |
| Cursor (Agent) | cursor |
| Codex CLI | codex |
| Gemini CLI | gemini |
| Continue | continue |
| OpenCode | opencode |
Part 3: 実践ワークフロー
基本的な使い方
# 1. worktree作成
git gtr new feature-a
# 2. エディタで開く
git gtr editor feature-a
# 3. AIツールを起動
git gtr ai feature-a
# 4. 一覧表示
git gtr list
# 5. 作業完了後、削除
git gtr rm feature-a
並列作業のワークフロー例
# ターミナル1: feature-aを自分で作業
git gtr new feature-a
git gtr editor feature-a
# → Cursorで手動コーディング
# ターミナル2: feature-bをAIエージェントに任せる
git gtr new feature-b
git gtr ai feature-b
# → AIエージェントが自動でコーディング
# 両方同時に進行!
実際の活用シーン
シーン1: AIに任せながら自分も作業
自分: feature-a(UIコンポーネント作成)をCursorで手動実装
AIエージェント: feature-b(API実装)を自動生成
→ 待ち時間ゼロで両方進む
シーン2: 急なhotfix対応
feature-a作業中にhotfix依頼が来た
従来: stash → checkout → 修正 → checkout → stash pop(面倒)
gtr: git gtr new hotfix → 修正 → git gtr rm hotfix(スムーズ)
シーン3: PRレビューしながら開発
自分: feature-aの開発を継続
別worktree: 同僚のPRブランチをチェックアウトしてレビュー
→ コンテキストスイッチなしで両立
良かった点・注意点
| 良かった点 | 注意点 |
|---|---|
| AIの待ち時間を有効活用できる | ディスク容量を使う(worktreeごとにファイルが増える) |
| ブランチ切り替えのストレスがない | 同じブランチを複数worktreeで開かない方が良い |
| 複数案件の並行管理がしやすい |
node_modules等は各worktreeでnpm install必要 |
| 各種AIエージェントとの相性が良い | 最初の設定が少し必要 |
現実的な並列数の限界
「並列化できる」と言っても、無限にタスクを増やせるわけではないです。
私の場合、最大3タスクが限界でした。理由は2つ:
- コンフリクトの問題 - 同時に触るファイルが増えると、マージ時にコンフリクトが頻発する。3タスク程度なら、担当範囲を分けやすい
- 頭の中の管理限界 - 「今どのworktreeで何をやっているか」を把握できるのは、自分の場合3つが限界だった
最初は2タスク並列から始めて、自分の限界を探ってみるのがおすすめです。
Docker環境での注意点
gtrはとても便利なツールですが、Docker環境で開発している場合は追加の考慮が必要です。私自身がハマったポイントを共有します。
問題1: worktreeがコンテナから見えない
gtrでworktreeを作成すると、デフォルトではリポジトリの親ディレクトリに作成されます。
~/projects/
├── my-app/ # メインリポジトリ(コンテナにマウント済み)
└── my-app-worktrees/ # ← ここはマウントされていない!
└── feature-a/
docker-compose.ymlで./:/appのようにメインリポジトリだけをマウントしていると、worktreeディレクトリはコンテナ内からアクセスできません。
問題2: ホストとコンテナのパス不一致
ホスト側とコンテナ内でパスが異なるケースが多いです。
gtrはホスト側で動くため、git gtr go feature-aで返されるパスはホストのパス。コンテナ内では使えません。
解決策: worktreeごとにDockerコンテナを分ける
各worktreeで独立したDockerコンテナを起動する構成がおすすめです。
ポイント:
- メインリポジトリのDBコンテナを共有
- 各worktreeのアプリは別ポートで起動
- コンテナ名も分けて衝突を回避
フックで自動セットアップ
gtrのpostCreateフックを使うと、worktree作成時に環境設定を自動化できます。
フック内では以下の環境変数が利用可能:
| 環境変数 | 内容 |
|---|---|
REPO_ROOT |
リポジトリルートのパス |
WORKTREE_PATH |
作成されたworktreeのパス |
BRANCH |
ブランチ名 |
セットアップスクリプトの例
#!/bin/bash
# scripts/setup-worktree.sh
# 既存のworktree数をカウントしてインデックスを決定
WORKTREE_COUNT=$(git worktree list | wc -l)
WORKTREE_INDEX=$((WORKTREE_COUNT - 1))
APP_PORT=$((3000 + WORKTREE_INDEX))
# .envファイルを生成
cp .env.example .env
echo "WORKTREE_INDEX=${WORKTREE_INDEX}" >> .env
echo "APP_PORT=${APP_PORT}" >> .env
# docker-compose.override.ymlをコピー
cp docker-compose.override.yml.example docker-compose.override.yml
echo "Setup complete: WORKTREE_INDEX=${WORKTREE_INDEX}, APP_PORT=${APP_PORT}"
.gtrconfigでフックを設定
[copy]
include = .env.example
include = docker-compose.override.yml.example
include = scripts/setup-worktree.sh
[hooks]
postCreate = bash scripts/setup-worktree.sh
[defaults]
editor = vscode
ai = claude
docker-compose.override.yml.example
# Worktree用Docker設定
services:
app:
container_name: app_wt${WORKTREE_INDEX:-0}
ports: !override
- "${APP_PORT:-3000}:3000"
environment:
DB_HOST: host.docker.internal # メインのDBを参照
db:
deploy:
replicas: 0 # DBは起動しない(メインを共有)
Docker + gtrの実践ワークフロー
# 1. worktree作成(フックで.envとdocker-compose.override.ymlが自動生成)
git gtr new feature-coupon
# 2. worktreeに移動
cd "$(git gtr go feature-coupon)"
# 3. Dockerコンテナを起動
docker compose up -d
# 4. Claude Codeで開発
git gtr ai feature-coupon
フックのおかげで、手動での環境設定が不要になります。
まとめ
- git worktreeはGit 2.5(2015年)からある機能だが、AIエージェント時代に再評価
- AI時代のボトルネックは「書く時間」から「待ち時間・切り替えコスト」へ
- git-worktree-runner (gtr) でworktree管理がシンプルに
- 「AIに任せて待つ」から**「AIと並列で動く」**へ開発スタイルを転換
まずは2つのworktreeを作って、並列作業の効果を体感してみてください!