はじめに#
Git worktreeは、1つのGitリポジトリに対して複数のワーキングツリー(作業ディレクトリ)を同時に作成・管理するための強力な機能です。この記事では、git worktreeの基本的な使い方を実践的なハンズオンで学びます。
解決する課題#
- ブランチ切り替え時の作業内容の退避・復元の手間
- 複数機能を並行開発する際の効率性の問題
- 緊急バグ修正と通常開発作業の両立
この記事で学べること#
- git worktreeの基本概念と仕組み
- 複数ワーキングツリーの作成・管理方法
- 実際の開発現場での活用パターン
対象読者#
- Gitの基本操作(add, commit, merge)を理解している方
- 複数ブランチでの並行作業を効率化したい方
- git worktreeを初めて使用する開発者
前提条件#
- Git: v2.5以降(git worktreeコマンド対応版)
- OS: Windows, macOS, Linux
- 必要な知識: Gitの基本操作(clone, checkout, merge等)
ハンズオン#
Step 0: 準備#
ハンズオン用のリポジトリを準備します:
# 作業用ディレクトリの作成と初期化
mkdir git-worktree-handson-tutorial
cd git-worktree-handson-tutorial
# Gitリポジトリの初期化
git init
# 初期ファイルの作成とコミット
echo "Hello World" > main.txt
git add main.txt
git commit -m "first commit"
このハンズオンではローカルリポジトリを使用しますが、実際の開発ではリモートリポジトリをクローンした環境でも同様に利用できます。
Step 1: 新機能開発用ワークツリーの作成#
mainブランチとは独立した場所で新機能feature-Aの開発を行うため、専用ワークツリーを作成します:
# feature-A用のワークツリーとブランチを同時作成
git worktree add ./feature-a-worktree -b feature-A
パラメータ説明:
./feature-a-worktree: 新規作成するディレクトリのパス-b feature-A: 新規作成するブランチ名
作成されたワークツリーの確認:
git worktree list
実行結果例:
/path/to/git-worktree-handson-tutorial 7a8b9c1 [main]
/path/to/git-worktree-handson-tutorial/feature-a-worktree 7a8b9c1 [feature-A]
この出力から、2つのワークツリーが並存していることが確認できます。
Step 2: feature-Aワークツリーでの開発作業#
作成したワークツリーで実際の機能開発を行います:
# feature-Aワークツリーに移動
cd feature-a-worktree
# 現在のブランチ確認
git branch
# 出力: * feature-A
# 新機能のファイルを作成
echo "Feature A implementation" > feature-A.txt
git add feature-A.txt
git commit -m "feat: Add feature-A implementation"
検証: 同時に元のディレクトリでも作業が可能であることを確認:
# 別のターミナルまたは後で元のディレクトリに戻って確認
cd .. # 元のディレクトリに戻る
git branch
# 出力: * main
ls # main.txtのみが存在(feature-A.txtは存在しない)
Step 3: 開発完了後のマージ作業#
feature-Aの開発が完了したため、mainブランチにマージします:
# mainブランチ(元のワークツリー)にいることを確認
pwd # /path/to/git-worktree-handson-tutorial
git branch
# 出力: * main
# feature-Aブランチをmainにマージ
git merge feature-A
マージ結果の確認:
# マージ履歴をグラフで確認
git log --graph --oneline --all
# ファイルが統合されていることを確認
ls
# 出力: main.txt feature-A.txt
Step 4: ワークツリーのクリーンアップ#
開発完了後は不要になったワークツリーを削除してリポジトリを整理します:
# 現在のワークツリー一覧を確認
git worktree list
# feature-Aワークツリーを削除
git worktree remove feature-a-worktree
注意: ワークツリー内に未コミットの変更がある場合、削除は失敗します。その場合は
--forceオプションで強制削除するか、事前に変更をコミットまたは破棄してください。クリーンアップ完了の確認:
# ワークツリー一覧を再確認(mainのみ残っていることを確認)
git worktree list
# 万が一、ディレクトリが残っている場合は手動削除
rm -rf feature-a-worktree
実践的な活用パターン#
パターン1: 緊急バグ修正と機能開発の並行作業#
# 通常の機能開発中(feature-loginブランチで作業中)
git worktree add ../hotfix-worktree -b hotfix/critical-bug
# hotfix作業完了後
cd ../hotfix-worktree
# バグ修正作業...
git add . && git commit -m "fix: critical security issue"
# mainにマージ
cd ../main-worktree
git merge hotfix/critical-bug
# 元の機能開発に戻る
cd ../feature-login-worktree
# 作業を継続...
パターン2: 複数バージョンの同時保守#
# v1.0系の保守用ワークツリー
git worktree add ../v1-maintenance origin/release-1.0
# v2.0系の保守用ワークツリー
git worktree add ../v2-maintenance origin/release-2.0
# 各バージョンで独立してバグ修正が可能
トラブルシューティング#
よくある問題と解決法#
問題1: ワークツリーの削除ができない
# エラー例: "worktree contains modified or untracked files"
# 解決法1: 変更を確認して必要に応じてコミット
cd problem-worktree
git status
git add . && git commit -m "save changes"
# 解決法2: 強制削除
git worktree remove --force problem-worktree
問題2: 同じブランチを複数のワークツリーで使用しようとしてエラー
# エラー例: "branch 'feature-x' is already checked out"
# git worktreeでは同じブランチを複数箇所で同時にチェックアウトできません
# 解決法: 異なるブランチ名を使用するか、既存のワークツリーを削除
問題3: ディレクトリが残っているがgit worktree listに表示されない
# 管理情報のクリーンアップ
git worktree prune
# 手動でディレクトリ削除
rm -rf orphaned-worktree
コマンドリファレンス#
# 基本的なワークツリー操作
git worktree add <path> -b <branch-name> # 新規ブランチ作成と同時にワークツリー作成
git worktree add <path> <existing-branch> # 既存ブランチからワークツリー作成
git worktree list # ワークツリー一覧表示
git worktree remove <path> # ワークツリー削除
git worktree prune # 孤立した管理情報のクリーンアップ
# 高度な操作
git worktree add --detach <path> <commit> # 特定のコミットをワークツリーとして作成
git worktree remove --force <path> # 未保存の変更があっても強制削除
git worktree move <path> <new-path> # ワークツリーの移動
git worktree lock <path> # ワークツリーをロック(自動削除を防ぐ)
git worktree unlock <path> # ワークツリーのロック解除
まとめ#
このハンズオンを通じて、git worktreeの基本的な操作から実践的な活用方法まで学習しました。
主要ポイント#
- 複数ワークツリーの同時管理: 1つのリポジトリで複数のブランチを並行作業
- 効率的な開発フロー: ブランチ切り替えに伴う時間的コストの削減
- 適切なクリーンアップ: 作業完了後のワークツリー削除でリポジトリを整理
実践的な価値#
- 開発効率向上: ビルド時間や依存関係の再インストール時間を短縮
- 作業の並行性: 緊急対応と通常開発を同時進行
- コンテキストスイッチの最小化: 作業内容の退避・復元が不要
次のステップ#
- 実際のプロジェクトでgit worktreeを試用
- チーム開発でのワークフロー改善に活用
- CI/CDパイプラインとの統合検討
git worktreeを活用することで、Git操作の効率性が大幅に向上し、より柔軟な開発体験を実現できます。