例えばレビュー依頼があってローカルで checkout したい時、開発のためにブランチ作成して変更を積んでいたりするとちょっと面倒ですよね…
$ git stash # 変更を退避
$ git checkout hoge # そのブランチにチェックアウト
# 〜〜用事が済んだら〜〜
$ git checkout original # 元のブランチをチェックアウト
$ git stash pop # 退避してた変更を戻すそんな時には git worktree コマンドを使うと、変更の退避などが不要になり便利です!
worktree コマンドとは
worktree コマンドは、そのリポジトリの作業ディレクトリを複数管理できるコマンドです。
上記の例で言うと、hoge ブランチがチェックアウトされた hoge ディレクトリを別に作成することで、元のディレクトリの作業中の状態を stash 等で変更せずにすみます。
$ git worktree add ../hoge hoge # ../hoge に hoge ブランチがチェックアウトされてる
# 〜〜用事が済んだら〜〜
$ git worktree remove ../hoge # ディレクトリごと削除これを使うだけでも便利さを感じられると思います。ぜひ試してみてください!
実際の開発現場での使い所
レビューの例以外でも worktree コマンドは活用できます。
並行して複数のブランチを開発したい場合
1つのリポジトリで複数の機能開発を並行して行うとき、頻繁な checkout は面倒なので、別ディレクトリでそれぞれ管理しましょう。
$ git worktree add ../feature-a feature-a
$ git worktree add ../feature-b feature-bこれで同時に並行して作業することができます。
(worktree 知る前は、clone で無理矢理複数ディレクトリ化を実現していたりしましたが、 config の内容を共有できるのでこちらの方が良さそうです)
過去のバージョンを確認したい場合
worktree を使えば現在の作業を維持しつつ、特定のリリースバージョンのコードを調査などができます。
$ git worktree add ../v1.2.0 v1.2.0これなら、現在の開発ブランチを維持したまま、特定のリリースバージョンのコードを調査できます。
一時的な修正を素早く適用したい場合
例えば、本番環境で急ぎのバグ修正が必要な場合、現在の作業を中断せずに修正対応ができます。
$ git worktree add ../hotfix-worktree main # main ブランチの worktree を作成
$ cd ../hotfix-worktree
$ git checkout -b hotfix-branch
# 〜〜修正をコミット〜〜
$ git push origin hotfix-branch各コマンド補足
worktree add
ブランチ名は省略することができ、省略した場合はパスをブランチ名として使います。
$ git worktree add ../hoge # hoge ブランチに切り替わるなので、 ../ をつける必要性を感じないなら、add と remove にブランチ名を渡すような要領で作成と削除ができます。(楽なので、レビューではこの運用をしています)
$ git worktree add hoge
# 〜〜用事が済んだら〜〜
$ git worktree remove hogeworktree prune
git worktree remove を使わずにディレクトリを削除した場合、worktree の情報として残ってしまいますが、
$ git worktree list # list は現在の
~/sample bd9024e [original]
~/sample/hoge e519da7 [hoge] prunableprunable となっている通り、git worktree prune コマンドでこの worktree 情報は削除できます。
※ prunable ではない worktree が消えることはないので、remove の代わりにこれを用いることはできません。
まとめ
git worktree コマンドを活用することで、複数の作業ディレクトリを管理しながらスムーズに開発を進めることができます。
日々の開発に git worktree を取り入れて、作業の効率化を図ってみてください!

