Tips

現在のmasterブランチがあるリポジトリ(例: my_project)のルートディレクトリにいるとする

`git worktree`は、一つのGitリポジトリに対して複数のワーキングツリー(作業ディレクトリ)を作成できるコマンドです。これにより、複数のブランチで同時に作業したり、別のブランチのコードを参照しながら現在の作業を進めたりといったことが簡単に行えます。

技術・言語・ツール: git worktree

git worktreeは、一つのGitリポジトリに対して複数のワーキングツリー(作業ディレクトリ)を作成できるコマンドです。これにより、複数のブランチで同時に作業したり、別のブランチのコードを参照しながら現在の作業を進めたりといったことが簡単に行えます。

複数のブランチで並行作業!git worktreeで効率アップ

開発中に「このバグ修正を急ぐ間、別の機能開発も進めたい」「あるブランチのコードを参照しながら、別のブランチで新しい機能を実装したい」といった状況はよくあります。通常はgit stashgit checkoutを繰り返すことになりますが、git worktreeを使えば、同じリポジトリの別のブランチを別のディレクトリにチェックアウトし、同時に作業を進めることができます。

# 現在のmasterブランチがあるリポジトリ(例: my_project)のルートディレクトリにいるとする

# 1. worktreeの作成 (feature/new-featureブランチを新しいディレクトリに作成)
#    現在のディレクトリの親ディレクトリに新しいディレクトリ (my_project_new_feature) が作られる
git worktree add ../my_project_new_feature feature/new-feature

# (オプション) 新しいブランチを作成しつつworktreeとして追加する
# git worktree add -b my-new-feature-branch ../my_project_new_feature_temp

# 2. 作成されたworktreeに移動して作業
cd ../my_project_new_feature
# ここでfeature/new-featureブランチとして作業でき、変更をコミット・プッシュできる

# 3. worktreeの一覧表示
git worktree list

# 4. worktreeの削除 (作業が完了したら)
# 削除するworktreeのディレクトリに移動した状態で実行することも可能
# git worktree remove .
# または、worktreeのルートディレクトリから実行 (worktreeのパスを指定)
git worktree remove ../my_project_new_feature
# 削除時にまだコミットされていない変更がある場合は --force オプションが必要な場合がある
# git worktree remove --force ../my_project_new_feature

注意点やおすすめポイント

  • コンテキスト切り替えの不要化: git stashgit checkout の手間が省け、作業ディレクトリのコンテキストを切り替えることなく複数の作業を並行して進められます。
  • テストの並行実行: 異なるブランチのコードに対して並行してテストを実行したい場合にも便利です。
  • リポジトリの重複を避ける: 別のディレクトリにgit cloneするのと似ていますが、git worktreeは実際のGitオブジェクトを共有するため、ディスク容量の節約になります。
  • 注意点: main (または master) ブランチのように、現在checkoutしているブランチを別のworktreeに追加することはできません。常に別のブランチをターゲットにするか、新しいブランチを作成してください。
  • git worktree remove時に、指定したディレクトリが空でない場合はエラーになることがあります。その際は、--forceオプションを使うか、手動でディレクトリを削除する必要があります。
  • ローカル環境のディスク容量に余裕があることを確認しましょう。