はじめに
今回は、git worktreeを使う中で個人的にはまったポイントがあったので、その内容と対処方法を共有します。
同じような状況で困っている方の助けになれば嬉しいです。
github worktreeとは
ローカルであるブランチにて開発している最中に
- 別ブランチで急ぎの修正をしたい
- 今の作業をcommitしたくない
- stashするほど作業が中途半端で、戻るタイミングも未定
といった状況になる場合があると思います。
そのようなときに便利なのがgit worktreeです。
git worktreeを使用すると、同じリポジトリを複数のディレクトリにチェックアウトでき、ブランチごとに独立した作業ディレクトリを持つことができます。
worktreeの作り方
testというリポジトリがあり、mainブランチからhogeという新たなブランチを切ってworktree作る場合は以下のようにします。
# git worktree -b add 新たなブランチ名 ~/新たなworktreeを配置するディレクトリ
git worktree -b add hoge ~/test-hoge
ハマってしまったところ
worktreeは、現在の作業中の差分を自動で引き継いではくれません。
例えば、
- testリポジトリで developブランチを切って作業中
- 途中でfeature-1ブランチを切って別作業をしないといけなくなった
- developの内容を一旦置いたまま、feature-1用のディレクトリを作りたい
という状況を考えます。
このとき、developブランチから新たにworktreeを作成する場合、以下のコマンドを実行してもdevelopブランチで作業していた未コミットの変更は新たに作成した側のworktreeには引き継がれません。
git worktree add -b moved-develop ~/test-moved-develop
対策
新しく作業するブランチだけをworktreeにする
- developの作業内容は元のディレクトリに残す
- 新しく作業が必要なfeature-1ブランチのみをworktreeとして作成する
この運用で問題ない場合は、これが最もシンプルです。
今の差分を worktree 側に「お引っ越し」する
どうしても今の作業差分を別 worktree に移したい場合は、stash を使うことで対応できます。
1.元ディレクトリ(test)で差分をstashする
git status # 変更内容を確認
git stash push -m "WIP develop before moving to worktree"
2.元ディレクトリ(test)がクリーンになったことを確認
git status
3.作成したworktree側(test-moved-develop)で stash を適用
stash は リポジトリ単位で共有されるため、別のworktreeからも同じstashを参照できます。
git stash list # さきほどの "WIP develop..." が見える
git stash pop # または git stash apply
まとめ
git worktreeにてはまった箇所と対処方法を紹介しました。
-
git worktreeは作業中の差分は自動では引き継がれない - 必要に応じて
- 新しく作業するブランチだけをworktreeする
- stashを使って差分を移動する
といった使い分けが重要だと学びました。
この記事が同じところではまった方の助けになれば嬉しいです。
最後までお読みいただきありがとうございました!