複数ブランチを並行して開発したい
こんな状況ありませんか?
- アサインされた開発チケットが複数あり、並行して開発している
- 運用が挟まり、developブランチの内容を確認したい
- 仕様待ちになったので、他チケットに着手したい
- コードレビュー待ちの間は他の開発をしていたが、レビューの指摘が来たので対応したい
git stash
は便利ですが、毎回行うのはしんどいし、stashした内容を再度反映させるときにミスするのも怖いですよね。
正直、stashした内容を覚えてないこともありませんか…?
git worktreeを使う
上記のような状況でgit worktree
が便利だったので紹介しておきます。
以下、リポジトリとブランチは下記として手順を説明します。
# リポジトリ
$ tree -L 1
.
└── myrepo
# ブランチ
$ git branch
main
* develop
feature/t1
手順
1. worktreeの対象ブランチを決める
ここではfeature/t1
ブランチとします。
2. worktreeを作成するディレクトリを決める
ここではdir_t1
ディレクトリにします。
git worktreeでは、worktreeを作成するディレクトリを決め、そこに作業ブランチを指定してソースコードを取得します。
挙動としてはgit clone
を2回行うのに近いです1
3. worktreeを作成
下記のコマンドを実行します。
コツは、対象のリポジトリと並列でworktreeを作成することです。
そうすることで、ソースコードの検索時に複数ヒットしてややこしくなるのを回避します。
$ git worktree add ../dir_t1 feature/t1
# ↑ ../ とすることで、並列に作成しています
この状態でgit branch
をすると、worktreeには+
が付きます
$ git branch
main
* develop
+ feature/t1
4. worktreeの移動
cd
を実行してディレクトリを移動するだけです。
$ cd ../dir_t1
$ git branch
main
+ develop
* feature/t1
$ tree -L 1
├── myrepo
└── dir_t1
この状態で、feature/t1
として開発できます。
やっぱりdevelopに戻りたい!となった場合はcd
で戻りましょう。
このときgit stash
をしなくても、変更は消えません。
5. さらにworktreeを増やす
feature/t1
での作業が途中でも、feature/t2
に着手する必要がある、そんな場面もあるでしょう。
そのときも素直にworktreeを増やせばOKです。
$ git worktree add ./dir_t2 feature/t2
main
+ develop
+ feature/t1
* feature/t2
$ tree -L 1
├── myrepo
├── dir_t1
└── dir_t2
6. 不要になったworktreeは削除
開発が完了したworktreeは不要なので削除しましょう。
$ git worktree remove feature/t1
ぶっちゃけ
環境構築が必要な場合、再度構築し直す必要はあります。
そして当然ですがサーバーの起動などは、ポートが被ったらできません。
それでも、複数ブランチの並行開発においては十分に便利であり、もっと早く知りたかった…!と思ったので紹介しました。