git では通常、リポジトリと作業ディレクトリとが一組になっています。git clone
をすると、作業ディレクトリの中に .git
ディレクトリ(=リポジトリ)が作成されます。
そして、この作業ディレクトリの中でブランチを切り替えて作業するのが一般的かと思います。
さて、作業ディレクトリの中で何かの作業中に、別の割り込み作業が発生して、一時的にブランチを切り替えたくなったとしましょう。そんなときは、いったん現在のブランチに作業中の変更をコミットしておいてからブランチを切り替えたり、作業中の変更を git stash
を使って保存してからブランチを切り替えたり、という操作をすることになります。
そういった操作が簡単に素早くできるのが git の特徴ではあります。しかしそれでも、そういった切り替えが多くなってくると、作業中の変更を失ってしまったり、現在のブランチを勘違いして作業してしまったり、といったミスを招く心配があります。
そんなとき、git worktree が便利かもしれません。
git worktree とは
git worktree
は、ひとつのリポジトリに対して、複数の作業ディレクトリを作成して管理することができます。
git worktree add <path> <branch>
で、指定パスに作業ディレクトリが作成できます。作業ディレクトリの内容は指定したブランチのものになります。
新しい作業ディレクトリにはリポジトリは複製されておらず、元のリポジトリを参照するようになっています。作業ディレクトリを見てみると、通常の .git
ディレクトリの代わりに、.git
という名前のファイルができていることが分かります。元の作業ディレクトリを "main working tree"、git worktree add
で作成した新しい作業ディレクトリを "linked working tree" と呼びます。
リポジトリを共有しているため、ひとつの working tree で特定のブランチにコミットを行うと、別の working tree でもそのブランチが更新されます。
linked working tree の管理
linked working tree の情報は、リポジトリで管理されています。git worktree list
で linked working tree の一覧が表示できます。
linked working tree を削除したい場合には、単にそのディレクトリを丸ごと削除します。そのあとで、main working tree で git worktree prune
を実行すると、linked working tree の情報が削除されます。
ちなみに、間違って main working tree を削除しないように気をつけてください(linked working tree はリポジトリ本体を持っていないので削除しても平気ですが、main working tree にはリポジトリ本体が含まれています)。
なお、main working tree は linked working tree のパスを持っており、linked working tree は main working tree のパスを持っています。このため、main working tree や linked working tree を後で別のパスに移動するとおかしくなってしまいます。この点は、git worktree
を活用する際には注意が必要です。
活用のパターン
パターン 1 : 割り込み作業のために linked working tree を作成する
作業ディレクトリ(main working tree)の中で何かの作業中に、別の割り込み作業が発生したとします。
そんなときに、作業中の main working tree をそのままにしておいて、git worktree add
で linked working tree を作成することができます。割り込み作業は linked working tree で行い、終わったら linked working tree を削除します。
main working tree はそのまま残っているので、すぐに元の作業に戻ることができます。
パターン 2 : 自分の作業のために linked working tree を作成する
上記のパターン 1 とは逆に、main working tree は普段は触らず、linked working tree で普段の作業をする、という方法もあります。割り込み作業は main working tree で行います。
普段の作業で常にトピックブランチを作成する習慣がある場合は、このパターンでも良さそうです。linked working tree 上でトピックブランチの作業をして、トピックブランチを master ブランチにマージしたら linked working tree を削除します。
まとめ
ひとつのリポジトリに対して、複数の作業ディレクトリを作成する git worktree
を紹介しました。便利かどうかは各自の使い方次第になると思いますが、選択肢のひとつとして知っておくと良いのではないかと思います。