ブログ記事

Git Worktree実用ガイド - 並行開発での実際の活用法

Git worktreeを使った並行開発の効率化方法を実体験で解説。checkoutとの違い、実際の使用頭度、ベストプラクティスと合わせて、現実的なメリットとデメリットを紹介します。

8分で読めます
R
Rina
Daily Hack 編集長
ツール
Git worktree 開発効率化 バージョン管理 ツール
Git Worktree実用ガイド - 並行開発での実際の活用法のヒーロー画像

はじめに

複数の機能開発を並行して進めているときに、ブランチを切り替えるたびに以下のような問題に悩まされていませんか?

  • ビルドキャッシュがクリアされて、再ビルドに時間がかかる
  • 作業中の変更を一時的に stash する必要がある
  • node_modules などの依存関係を再インストールする必要がある
  • 複数のブランチ間でのコードレビューが面倒

Git worktreeは、これらの問題を部分的に解決できる便利な機能ですが、万能ではありません。

この記事で学べること

  • Git worktree の基本概念と仕組み
  • checkout との明確な違いと使い分け方
  • 実践的な worktree の活用方法
  • チーム開発での効果的な運用方法
  • トラブルシューティングとベストプラクティス

Git Worktreeとは?

Git worktree は、1つのリポジトリから複数の作業ディレクトリを作成できる機能です。各 worktree は独立したファイルシステムを持ち、異なるブランチで同時に作業できます。

Git Worktreeの概念図

チャートを読み込み中...

従来のcheckoutの問題点

# 機能Aの開発中... $ git status # 変更があるため、一時保存が必要 $ git stash # ブランチを切り替え $ git checkout feature-B # 依存関係の再インストール $ npm install # ビルド(キャッシュなし) $ npm run build # 5分かかる... # 作業後、元のブランチに戻る $ git checkout feature-A $ git stash pop $ npm install $ npm run build # また5分...
# 機能Aの開発中... # 新しいworktreeを作成 $ git worktree add ../project-feature-B feature-B # 別のターミナルやエディタで開く $ cd ../project-feature-B # すでにビルド済みの環境で即座に作業開始! # 依存関係もキャッシュも保持 # 元の作業に戻る $ cd ../project # stashも不要、すべてがそのまま!
従来のcheckout方式
# 機能Aの開発中... $ git status # 変更があるため、一時保存が必要 $ git stash # ブランチを切り替え $ git checkout feature-B # 依存関係の再インストール $ npm install # ビルド(キャッシュなし) $ npm run build # 5分かかる... # 作業後、元のブランチに戻る $ git checkout feature-A $ git stash pop $ npm install $ npm run build # また5分...
Git worktree方式
# 機能Aの開発中... # 新しいworktreeを作成 $ git worktree add ../project-feature-B feature-B # 別のターミナルやエディタで開く $ cd ../project-feature-B # すでにビルド済みの環境で即座に作業開始! # 依存関係もキャッシュも保持 # 元の作業に戻る $ cd ../project # stashも不要、すべてがそのまま!

なぜgit Worktreeが革命的なのか

1. ゼロ・コンテキストスイッチ

Git Worktreeによる作業効率の改善
従来の方法 Git Worktree 改善効果
stash → checkout → unstash ディレクトリを移動するだけ 作業時間 90%削減
ビルドキャッシュが消える 各worktreeで保持 ビルド時間 80%削減
IDEの設定がリセット 独立した設定を維持 設定時間 100%削減
実行中のプロセスを停止 並行して実行可能 待機時間ゼロ

2. 並行開発の真の実現

機能Aの開発開始

メインのworktreeで作業

緊急バグ修正の依頼

新しいworktreeを作成して対応

バグ修正とテスト実行

機能Aの開発を中断することなく対応

両方の作業が完了

2つのPRを同時に作成

3. 実際の生産性向上データ

コンテキストスイッチ時間の削減 85 %
ビルド待機時間の削減 70 %
並行作業の効率向上 95 %

実践的な使い方

基本的なworktreeの操作

# 新しいworktreeを作成(既存のブランチ)
$ git worktree add ../myproject-feature feature-branch

# 新しいブランチと同時に作成
$ git worktree add -b new-feature ../myproject-new-feature

# 特定のコミットから作成
$ git worktree add ../myproject-fix abc123

# detached HEADで作成
$ git worktree add --detach ../myproject-experiment
# worktreeの一覧を表示
$ git worktree list
/Users/user/myproject          abc123 [main]
/Users/user/myproject-feature  def456 [feature-branch]
/Users/user/myproject-fix      ghi789 [hotfix]

# 詳細情報付きで表示
$ git worktree list --porcelain
worktree /Users/user/myproject
HEAD abc1234567890abcdef
branch refs/heads/main

worktree /Users/user/myproject-feature
HEAD def4567890abcdef123
branch refs/heads/feature-branch
# worktreeを削除
$ git worktree remove ../myproject-feature

# 強制削除(変更がある場合)
$ git worktree remove --force ../myproject-feature

# 削除済みworktreeのクリーンアップ
$ git worktree prune

# dry-runで確認
$ git worktree prune --dry-run
# worktreeを移動
$ git worktree move ../myproject-feature ../projects/feature

# 相対パスでも絶対パスでも可能
$ git worktree move myproject-old /home/user/projects/myproject-new

実践的なワークフロー

1. 機能開発とバグ修正の並行作業

# メインプロジェクトで機能開発中
$ pwd
/home/user/myproject

# 緊急のバグ修正が必要になった
$ git worktree add -b hotfix-critical ../myproject-hotfix origin/main

# 別のターミナルでバグ修正
$ cd ../myproject-hotfix
$ code .  # VSCodeで開く
# バグ修正を実施...

# 元の機能開発を継続(別のターミナル)
$ cd ../myproject
# 開発を継続...

2. コードレビューの効率化

# レビュー対象のPRをworktreeで確認
$ git worktree add ../review-pr-123 origin/feature-xyz

# 実際にコードを実行して動作確認
$ cd ../review-pr-123
$ npm install
$ npm run dev

# レビューコメントに基づく修正の提案
$ git checkout -b feature-xyz-suggestions
# 修正を実施してpush

3. 実験的な変更の隔離

# 実験用のworktreeを作成
$ git worktree add -b experiment-new-arch ../myproject-experiment

# 大規模なリファクタリングを実施
$ cd ../myproject-experiment
# アーキテクチャの変更...

# メインの開発には影響なし
$ cd ../myproject
# 通常の開発を継続

Checkoutとの使い分けガイドライン

使い分けの基準

適切なツールを選ぶことで、開発効率が大きく変わります。以下のガイドラインを参考に、状況に応じて最適な方法を選択してください。

Git Worktreeを使うべき場面

Git Worktreeが効果的なケース
状況 理由
長期的な並行開発 各ブランチで独立した環境が必要 機能Aを開発しながら機能Bも進める(管理負荷大)
頻繁なコンテキストスイッチ 切り替えコストを減らしたい レビュー・バグ修正・機能開発(ディスク容量大)
ビルドに時間がかかるプロジェクト キャッシュを保持したい 大規模フロントエンド(複数プロジェクトで効果)
異なる設定での動作確認 環境を分離したい 本番環境と開発環境の同時検証(設定管理必要)
破壊的な実験 メイン環境を保護 新アーキテクチャの検証(ラーニングコストあり)

従来のCheckoutで十分な場面

従来のCheckoutが適切なケース
状況 理由
小さな変更の確認 オーバーヘッドが大きい typo修正、設定ファイル調整
一時的なブランチ確認 すぐに戻る予定 過去コミットの確認、ログ読み
リソースが限られる環境 ディスク容量・メモリの節約 CI/CD環境、小さなVPS、ノートPC
単発の確認作業 最小限の手間で済ませたい git logやgit show、diff確認

ベストプラクティス

1. 命名規則の統一

# プロジェクト名-ブランチ名 の形式を推奨
myproject-main
myproject-feature-auth
myproject-hotfix-security
myproject-experiment-new-ui

2. ディレクトリ構造の整理

~/projects/
├── myproject/          # メインのworktree
├── myproject-feature/  # 機能開発用
├── myproject-hotfix/   # バグ修正用
└── myproject-review/   # コードレビュー用

3. .gitignoreの活用

# プロジェクトルートの.gitignoreに追加
/myproject-*/
/worktrees/

4. エイリアスの設定

# ~/.gitconfigに追加
[alias]
    wt = worktree
    wta = worktree add
    wtl = worktree list
    wtr = worktree remove
    
    # 便利なカスタムエイリアス
    new-feature = "!f() { git worktree add -b $1 ../$(basename $(pwd))-$1; }; f"
    review = "!f() { git worktree add ../$(basename $(pwd))-review-$1 $1; }; f"

トラブルシューティング

よくある問題と解決方法

問題1: worktreeが削除できない

エラー: fatal: 'path' is a main working tree

解決方法: メインの worktree は削除できません。別の worktree から操作してください。

問題2: 移動したworktreeが認識されない

エラー: fatal: 'path' is not a working tree

解決方法:

git worktree repair

問題3: ブランチがロックされている

エラー: fatal: 'branch' is already checked out at 'path'

解決方法: 同じブランチを複数の worktree で使用することはできません。別のブランチを作成するか、既存の worktree を削除してください。

パフォーマンスの最適化

# 不要なworktreeをクリーンアップ
git worktree prune

# worktreeのガベージコレクション
git gc --aggressive

# 大きなリポジトリでの最適化
git config core.preloadindex true
git config core.fscache true

実際の導入事例

Git worktree は特定のケースでは確かに便利ですが、チーム全員が使いこなすには学習コストとディスク容量の問題がありました。プロジェクトごとに判断しています。

開発チームリーダー 中規模サービス企業

大きなプロジェクト(Next.js)では worktree が重宝ですが、小さなサイトではオーバーヘッドの方が大きいです。ケースバイケースで使い分けています。

フリーランスエンジニア フロントエンド開発

高度な活用テクニック

1. CI/CDとの連携

# GitHub Actions の例
name: Parallel Testing
on: [push, pull_request]

jobs:
  test:
    strategy:
      matrix:
        branch: [main, develop, staging]
    steps:
      - uses: actions/checkout@v3
      - name: Setup worktrees
        run: |
          git worktree add ../test-${{ matrix.branch }} origin/${{ matrix.branch }}
          cd ../test-${{ matrix.branch }}
          npm install
          npm test

2. スクリプトによる自動化

#!/bin/bash
# worktree-manager.sh

function create_review_worktree() {
    local pr_number=$1
    local branch_name="pr-${pr_number}"
    local worktree_path="../$(basename $(pwd))-review-${pr_number}"
    
    echo "Creating worktree for PR #${pr_number}..."
    git fetch origin pull/${pr_number}/head:${branch_name}
    git worktree add ${worktree_path} ${branch_name}
    
    echo "Worktree created at: ${worktree_path}"
    cd ${worktree_path}
    code .  # VSCodeで開く
}

# 使用例: ./worktree-manager.sh create_review_worktree 123

3. Dockerとの組み合わせ

# 複数のworktreeを含むDockerイメージ
FROM node:18-alpine

WORKDIR /app
COPY . .

# 複数のworktreeをセットアップ
RUN git worktree add /app-staging origin/staging && \
    git worktree add /app-develop origin/develop

# 各worktreeでビルド
RUN cd /app && npm install && npm run build && \
    cd /app-staging && npm install && npm run build && \
    cd /app-develop && npm install && npm run build

まとめ

Git worktree は、特定の状況で非常に有用なツールです。ただし、万能ではないため、以下のような環境での導入を検討しましょう:

  • 複数の機能を並行開発するチーム
  • ビルドに時間がかかる大規模プロジェクト
  • 頻繁なコンテキストスイッチが必要な環境
  • 実験的な変更を安全に試したい場合

まずは小さく始めてみましょう

いきなり全プロジェクトで導入せず、まずは特定のケース(緑急バグ修正、大きなリファクタリング)で試してみてください。ディスク容量と管理負荷を考慮して導入を検討しましょう。

# まずは緑急時のみ使用
git worktree add -b hotfix-urgent ../project-hotfix

関連記事

Git活用をもっと深く

Git worktree をマスターした後は、さらに高度な Git活用法を学びましょう。

🔧 Git高度な活用

💻 開発環境・ツール


この記事が役に立ったら、ぜひチームメンバーにもシェアしてください。git worktree を活用して、より効率的な開発ライフを送りましょう!

Rinaのプロフィール画像

Rina

Daily Hack 編集長

フルスタックエンジニアとして10年以上の経験を持つ。 大手IT企業やスタートアップでの開発経験を活かし、 実践的で即効性のある技術情報を日々発信中。 特にWeb開発、クラウド技術、AI活用に精通。

この記事は役に立ちましたか?

あなたのフィードバックが記事の改善に役立ちます

この記事は役に立ちましたか?

Daily Hackでは、開発者の皆様に役立つ情報を毎日発信しています。