ソースコードのバージョン管理を GitLab と SourceTree で行っている。
SourceTree でブランチを切り替える際、ローカルの変更を残したい場合は、元ブランチでコミット、またはスタッシュしてからブランチを切り替える必要がある。
コミットすると修正箇所の一覧が SourceTree 上で閲覧できなくなるし、スタッシュはそもそも一時退避用の機能で、どのブランチのいつの修正か~とか管理するものではない。
元ブランチにローカルの修正を残したまま切り替えたいが、何か良い方法はないものか。
コミットもスタッシュもせずにブランチを切り替える
Git の worktree という機能を使用する。
これは、チェックアウト中のブランチを別リポジトリとして複製し、新たなワークスペースを設ける機能。
例えば、my-app というリポジトリの master ブランチで作業しているとする。
このリポジトリの sample.txt をローカルで修正し、これを残したままワークツリーを切り替える。
※ SourceTree の UI ではワークツリーは使用できないため、コンソールから操作する。
ワークツリーの作成
my-app リポジトリに移動してから、以下のコマンドを実行する。
git worktree add ../my-app_feature-sample -b feature/sample
git worktree add ../[新規リポジトリ名] -b [ブランチ名]
すると、my-app リポジトリと同じ階層に my-app_feature-sample というリポジトリが複製される。
このとき、ローカルで修正していた sample.txt の修正内容は my-app_feature-sample には引き継がれない。
あとは、SourceTree 上で新たに my-app_feature-sample というプロジェクトを登録し、普段通り作業すればよい。
ワークツリーで作成したブランチはどちらのリポジトリからも見える
git branch を使用すると、feature/sample ブランチは my-app、my-app_feature-sample のどちらのリポジトリにも存在する。
しかし、my-app 上で feature/sample ブランチをチェックアウトしようとすると、以下のエラーとなる。
already used by worktree at 'xxx/my-app_feature-sample'
worktree: my-app_feature-sample で使用されているので、my-app からはチェックアウトできない、という意味。
ちゃんと意図したワークツリーに紐づいていることがわかる。
ワークツリーの削除
以下のコマンドで削除する。
git worktree remove ../my-app_feature-sample
※パスはブランチ名ではなく、ディレクトリ名を指定する。
面倒なのが、このコマンドでは、worktree のディレクトリは削除されるが、ブランチが削除されない点。
ワークツリーのもととなった my-app、my-app_feature-sample に紐づいていた
feature/sample ブランチが残り続けるため、my-app から別途削除する必要がある。
git branch -d feature/sample

コメント