Git Worktreeで複数のブランチを並行して作業する

開発をしていて複数のブランチを同時に扱いたい場合があります。

例えば、新機能の開発をしているときに緊急でバグ修正があるといったケースです。 通常はブランチを切り替えて対応しますが、作業中の変更の扱いに困ることがあります。

最近、GitのWorktreeという機能を知り、このような問題を解決できることがわかりました。

この記事では、Git Worktreeの基本的な使い方とユースケースについて紹介します。

前提条件

  • Gitの基本的なコマンド操作ができること

Git Worktreeとは

通常、Gitリポジトリは1つの作業ツリー(ワーキングディレクトリ)を持ちます。

Git Worktreeは、同じリポジトリから複数の作業ツリーを作成し、異なるブランチを同時にチェックアウトできる機能です。

概要としては、ブランチの数だけそれに対応するフォルダを作成できるので、複数のブランチを並行して作業することができます。

基本的な使い方

新しいブランチとフォルダを作成

以下のようなコマンドで新しいブランチとフォルダを作成します。指定したベースブランチから新しいブランチを作成し、その内容を指定したフォルダにチェックアウトします。

git worktree add -b <ブランチ名> <フォルダパス> <ベースブランチ>

実際に使う際は、フォルダを既存のリポジトリのルートと同じ階層に作成する方が管理の面でよいと思います。

具体例は以下の通りです。

git worktree add -b feature-branch ../feature-branch main

コマンドを実行した後のフォルダ構造は以下のようになります。

feature-branch/ ← ここに新しい作業ツリーが作成される(feature-branchブランチ)
  ├── .git
  ├── src/
  ├── README.md
my-repo/ ← コマンドを実行した元のリポジトリ(mainブランチ)
  ├── .git/
  ├── src/
  ├── README.md

ブランチの切り替え

通常はgit checkoutコマンドでブランチを切り替えますが、Worktreeを使う場合はディレクトリを移動するだけで済みます。

各Worktree内でgit checkoutコマンドを実行することもできますが、Worktreeの利点はフォルダ移動だけで異なるブランチの作業に切り替えられる点です。

Worktreeの削除

以下のコマンドを実行するとフォルダが削除されます。
※ブランチ自体は削除されません。

git worktree remove <フォルダパス>

ブランチを削除したい場合は、通常のgit branch -d <ブランチ名>コマンドを実行してください。

git worktree removeコマンドを使わずに手動でフォルダを削除した場合など、実体が存在しない作業ツリーの情報を.git/worktreesから削除するには以下のコマンドを実行します。

git worktree prune

Worktreeの一覧表示

以下のコマンドで現在のWorktreeの一覧を表示できます。

git worktree list

ユースケース

バグなどの緊急対応

新機能の開発中に緊急でバグ対応が必要になった場合が該当します。まだ実装中でコミットするには早い、という場合、通常であればstashを使って作業内容を一時的に退避してからブランチを切り替えます。

Git Worktreeを使うことによって、多くの場合、stashを使わずに対応できます。進行中の作業をそのままにしておき、別のフォルダでバグ修正を行うことができます。退避・ブランチ切替・復元という手順を踏む必要がありません。

複数の機能開発の並行作業

複数の新機能を同時に開発する場合にも有効です。各機能ごとにWorktreeを作成し、それぞれのフォルダで独立して作業を進めることができます。

最後に

本記事ではGit Worktreeの概要と基本的な使い方、ユースケースについて紹介しました。

まずはローカルのGitリポジトリでWorktreeを作って動作を確認することをお勧めします。

ブランチ運用の有用な選択肢になると思います。

参考リンク

執筆担当者プロフィール
古川 貴浩

古川 貴浩(日本ビジネスシステムズ株式会社)

アプリケーション開発をしています。.NETやAI関連が好きです。

担当記事一覧