ソースコードのバージョン管理を GitLab と SourceTree で行っている。
SourceTree でブランチを切り替える際、ローカルの変更を残したい場合は、元ブランチでコミット、またはスタッシュしてからブランチを切り替える必要がある。
コミットすると修正箇所の一覧が SourceTree 上で閲覧できなくなるし、スタッシュはそもそも一時退避用の機能で、どのブランチのいつの修正か~とか管理するものではない。
元ブランチにローカルの修正を残したまま切り替えたいが、何か良い方法はないものか。
コミットもスタッシュもせずにブランチを切り替える
Git の worktree という機能を使用する。
これは、チェックアウト中のブランチを別リポジトリとして複製し、新たなワークスペースを設ける機能。
例えば、my-app というリポジトリの master ブランチで作業しているとする。
このリポジトリの sample.txt をローカルで修正し、これを残したままワークツリーを切り替える。
※ SourceTree の UI ではワークツリーは使用できないため、コンソールから操作する。
ワークツリーの作成
my-app リポジトリに移動してから、以下のコマンドを実行する。
現在チェックアウトしているローカルブランチを基に、feature/sample というローカルブランチを新規作成する。
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 worktree add ../my-app_feature-sample -b feature/sample origin/sample
git worktree add [ワークツリーを作成するディレクトリパス] -b [新しいブランチ名] origin/[リモートブランチ名]
タグからワークツリーを作成する場合
git fetch --tags // リモートからタグ一覧を取得
git worktree add ../my-app_feature-sample -b feature/sample vN.N.N-rc.N
git worktree add [ワークツリーのパス] -b [新しいブランチ名] [タグ名]
ワークツリーで作成したブランチはどちらのリポジトリからも見える
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

コメント