Git Worktreeとは?
Git worktreeは、1つのGitリポジトリから複数の作業ディレクトリを作成できる機能です。通常のGitでは、一度に1つのブランチしかチェックアウトできませんが、worktreeを使うことで、同じリポジトリの異なるブランチを同時に複数のディレクトリで扱えるようになります。
この機能はGit 2.5以降で利用可能で、現代の開発ワークフローにおいて非常に便利なツールとして注目されています。
Git Worktreeが解決する問題
開発中によくある以下のような状況を想像してみてください:
- 新機能の開発中に、急遽バグ修正が必要になった
- 複数の機能を並行して開発したい
- コードレビューのために別ブランチをチェックしたいが、現在の作業を中断したくない
- 実験的な変更を試したいが、メインの作業に影響を与えたくない
従来はgit stash
やgit checkout
を使ってブランチを切り替えていましたが、これには以下の問題がありました:
- 未追跡ファイルがstashされない
- 頻繁なブランチ切り替えによる認知的負荷
- 作業コンテキストの喪失
- 中途半端な変更のcommitを強いられる
Git Worktreeの基本的な使い方
1. Worktreeの作成
最も基本的なworktreeの作成方法は以下の通りです:
# 既存のブランチ用のworktreeを作成
git worktree add ../path/to/new-worktree existing-branch
# 新しいブランチ用のworktreeを作成
git worktree add ../path/to/new-worktree new-branch-name
# 新しいブランチを指定した名前で作成
git worktree add -b new-branch-name ../path/to/new-worktree
2. Worktreeの一覧表示
現在のworktreeの状況を確認するには:
git worktree list
詳細情報付きで表示:
git worktree list -v
3. Worktreeの削除
作業が完了したworktreeを削除:
git worktree remove path/to/worktree
古いworktreeのメタデータをクリーンアップ:
git worktree prune
実践的な使用例
シナリオ1:緊急バグ修正
新機能の開発中に緊急のバグ修正が必要になった場合:
# 現在feature-branchで作業中
git branch
* feature-branch
main
# 緊急修正用のworktreeを作成
git worktree add -b hotfix ../hotfix main
# hotfixディレクトリに移動して修正作業
cd ../hotfix
# バグ修正作業...
git add .
git commit -m "緊急バグ修正"
git push origin hotfix
# 元の作業ディレクトリに戻る
cd ../original-project
# feature-branchでの作業を継続
シナリオ2:複数機能の並行開発
# メイン機能の開発
git worktree add ../feature-a feature-a
# サブ機能の開発
git worktree add ../feature-b feature-b
# 各ディレクトリで独立して作業可能
cd ../feature-a
# feature-aの開発...
cd ../feature-b
# feature-bの開発...
シナリオ3:コードレビューとテスト
# レビュー対象のブランチをworktreeでチェックアウト
git worktree add ../review-branch origin/pull-request-branch
# レビュー作業
cd ../review-branch
# コードレビュー、テスト実行など
# 元の作業に戻る
cd ../main-project
高度な使用方法
ベアリポジトリとの組み合わせ
より効率的なworktreeワークフローのために、ベアリポジトリを使用する方法:
# ベアリポジトリとしてクローン
git clone --bare https://github.com/user/repo.git repo.git
# configを編集してすべてのリモートrefを取得
cd repo.git
# .git/configファイルのremote "origin"セクションに以下を追加:
# fetch = +refs/*:refs/*
# 各ブランチ用のworktreeを作成
git worktree add main main
git worktree add feature-branch feature-branch
一時的なworktreeの作成
実験やテスト用の使い捨てworktree:
# detached HEADでworktreeを作成
git worktree add -d ../experiment
# 特定のcommitからworktreeを作成
git worktree add ../test-commit abc1234
Worktreeのベストプラクティス
1. 命名規則の統一
わかりやすい命名規則を採用しましょう:
# 良い例
git worktree add ../feature-user-auth feature/user-auth
git worktree add ../bugfix-memory-leak bugfix/memory-leak
git worktree add ../hotfix-security hotfix/security-issue
2. ディレクトリ構造の整理
worktreeを専用ディレクトリにまとめて管理:
project/
├── main.git/ # ベアリポジトリ
├── worktrees/
│ ├── main/ # メインブランチ
│ ├── feature-a/ # 機能A
│ ├── feature-b/ # 機能B
│ └── hotfix/ # 緊急修正
3. 定期的なメンテナンス
# 不要なworktreeの削除
git worktree prune
# worktreeの状況確認
git worktree list
# 古いブランチのクリーンアップ
git branch -d completed-feature
4. 同期の保持
各worktreeを最新状態に保つ習慣:
# 各worktreeでリモートから最新を取得
cd ../main-worktree
git pull origin main
cd ../feature-worktree
git fetch origin
git rebase origin/main
よくあるエラーと対処法
「ブランチが既にチェックアウトされています」エラー
fatal: 'feature-branch' is already checked out at '/path/to/existing/worktree'
対処法: 同じブランチは複数のworktreeでチェックアウトできません。既存のworktreeを確認して削除するか、別のブランチを使用してください。
「パスが既に存在します」エラー
fatal: '/path/to/directory' already exists
対処法: 指定したパスが既に存在します。空のディレクトリを指定するか、既存のディレクトリを削除してください。
Worktreeが削除できない場合
# 強制削除オプションを使用
git worktree remove --force path/to/worktree
# 手動でディレクトリを削除後、pruneを実行
rm -rf path/to/worktree
git worktree prune
パフォーマンスと制限事項
利点
- 高速なブランチ切り替え: ディレクトリ移動だけで済む
- ディスク容量の効率性: .gitディレクトリは共有される
- 並行作業の効率化: コンテキストスイッチの削減
注意点
- ディスク容量: 作業ファイルは各worktreeで複製される
- ツールサポート: 一部のIDEやGUIツールで完全サポートされていない場合がある
- 管理の複雑性: 多数のworktreeは管理が煩雑になる可能性
チーム開発での活用
CI/CDとの連携
各worktreeで独立したビルドとテストが可能:
# 各worktreeでのビルドスクリプト例
#!/bin/bash
for worktree in $(git worktree list --porcelain | grep "worktree " | cut -d' ' -f2); do
echo "Building in $worktree"
cd "$worktree"
npm install && npm test
done
コードレビューワークフロー
Pull Requestのレビュー専用worktreeを作成:
# GitHub CLIと組み合わせた例
gh pr checkout 123 --worktree ../pr-123
cd ../pr-123
# レビュー作業...
まとめ
Git worktreeは、現代の開発ワークフローにおいて非常に強力なツールです。特に以下のような場面で威力を発揮します:
- マルチタスクな開発環境
- 緊急対応が必要な本番環境
- 実験的な機能開発
- コードレビューの効率化
初心者の方は、まず簡単なケースから始めて、徐々に複雑なワークフローに適用していくことをお勧めします。適切に使用すれば、開発効率が大幅に向上し、より柔軟で生産性の高い開発体験を得ることができるでしょう。
重要なのは、worktreeを作成したら必要に応じて削除し、定期的にメンテナンスを行うことです。これにより、常にクリーンで管理しやすい開発環境を維持できます。