4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

別ブランチを参照しながら作業するために git worktree を使ってみる

Last updated at Posted at 2023-11-22

別ブランチを参照しながら作業するために git worktree を使ってみる

解決したいこと

同じリポジトリ内の別のブランチにあるコードを参考にしたい場合、以下のような方法が考えられますが、それぞれ使いにくい部分もあります。

  • 別のフォルダに clone する
    • 同じリポジトリが複数の場所に存在することになるので、管理が煩雑になる
  • ブラウザでGitHubを開いてコードを参照する
    • 検索しにくい
  • GitHub Webベースエディタ(github.dev)で参照する
    • 検索もできるし編集もできるが、表示できる件数に制限があったりする
    • すべての拡張機能が使えるわけではない

上記以外にgit worktree というコマンドを利用する方法もあるということで、使い方を調べてみました。

環境情報

項目 バージョン
OS macOS 13.6.1
Git 2.43.0

git worktree の使い方

基本的な使い方に絞って紹介します。

他のコマンドなど詳しいことは Git - git-worktree Documentation などを参照ください。

worktreeを作る

通常、ブランチはひとつで、他のブランチで作業したい場合は、今のブランチから作業したいブランチに切り替える必要があります。

その際、差分が残っているとブランチの切り替えができないため、作業中状態でコミットするか、 stash で退避するなどして切り替えることになると思いますが、 git worktree コマンドを利用することで、現在の作業ブランチを残したまま、別のブランチをチェックアウトすることができます。

例えば現在ローカルにあるブランチが以下のような場合に、 feature/project-hoge ブランチで開発を進めるのですが、その実装する内容と同等の内容がすでに feature/project-fuga ブランチに実装されているので、参照したいとします。

$ git branch
  develop
* feature/project-hoge
  feature/project-fuga
  master
  staging

現在 feature/project-hoge ブランチにいるので、worktreeとして feature/project-fuga ブランチをチェックアウトします。

このときは git worktree add <worktree directory> <branch> というコマンドを実行します。

<worktree directory> は、checkoutするブランチのソースコード一式を格納するためのディレクトリです。

例えば以下のように実行すると、ブランチ一覧に * が付いた現在のブランチ以外にチェックアウトされている + がついたブランチができます。

$ git worktree add .worktree-fuga feature/project-fuga
$ git branch
  develop
* feature/project-hoge
+ feature/project-fuga
  master
  staging

プロジェクトディレクトリ内を見ると、指定したディレクトリが作られており、その中身は feature/project-fuga ブランチのソースコード一式が格納されています。

$ ls -Al
...
drwxr-xr-x@   42 miura-ut  staff    1344 11 17 14:59 .worktree-fuga
...

worktreeへ切り替える

ブランチの切り替えは git checkout <branch> を使いますが、worktreeをチェックアウトしようとするとエラーになります。

$ git checkout feature/project-fuga
fatal: 'feature/project-fuga' is already checked out at '/Users/miura-ut/workspace/sportsbull/.worktree-fuga'

すでに該当ディレクトリに feature/project-fuga ブランチが出力された状態なので、そのディレクトリに移動することでworktreeへ切り替わります。

$ git status
On branch feature/project-hoge
$ cd .worktree-fuga
$ git status
On branch feature/project-fuga

worktreeの一覧

プロジェクト内のworktreeの一覧を表示します。

worktreeがチェックアウトされているディレクトリとブランチ名が確認できます。

$ git worktree list
/Users/miura-ut/workspace/sportsbull                        4460a16347 [feature/project-hoge]
/Users/miura-ut/workspace/sportsbull/.worktree-fuga  a1bb8eda31 [feature/project-fuga]

worktreeの削除

ブランチを削除するには git branch -d <branch> を使いますが、worktreeのブランチを指定した場合、エラーになります。

$ git branch -d feature/project-fuga
error: Cannot delete branch 'feature/project-fuga' checked out at '/Users/miura-ut/workspace/sportsbull/.worktree-fuga

worktreeを削除するには git worktree remove <worktree directory> を使います。

$ git worktree remove .worktree-fuga
$ git worktree list
/Users/miura-ut/workspace/sportsbull  4460a16347 [feature/project-hoge]
$ git branch
  develop
* feature/project-hoge
  feature/project-fuga
  master
  staging

worktreeが解除された feature/project-fuga ブランチが残りますが、これは git branch -d で削除が可能です。

worktreeで開発する

worktreeは以下はプロジェクト直下とは分離され、単独でチェックアウトしたブランチの状態になっています。

そのため、そこでコードを編集したり実行することや、Git操作も可能です。

単純に他のブランチを参照するという使い方だけでなく、モノレポ(複数プロジェクトを1リポジトリで管理する)構成の場合に、並行して複数プロジェクトを開発するような場合にも有効だと思いました。

ただ、利用する中で個人的に気になった点がありましたので、記載しておきます。

worktreeディレクトリが差分になってしまう

worktreeディレクトリは、プロジェクト本体としては管理外のため、 git status で差分として認識されてしまいます。

$ git status
On branch feature/project-hoge
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .worktree-fuga/

nothing added to commit but untracked files present (use "git add" to track)

worktreeのディレクトリ名は自由につけられるので、自分が使う場合の名前を決めておいて、 $HOME/.gitignore に追加しておくことで無視させるのが良さそうです。

上記までの例の場合、 .worktree-<個別> のような命名規則としていますので、以下のように .gitignore に書くことで差分と認識されないようにすることができます。

.worktree-*

worktreeディレクトリ内も検索されてしまう

プロジェクト全体を検索した場合に、worktreeディレクトリ内のソースコードもヒットしてしまい、検索結果に同じような結果が出てしまいます。

worktreeディレクトリを検索対象外にする必要があります。

VSCodeなら files to exclude を指定することで、worktreeディレクトリを除外することができます。

GUIでworktreeを使いたい

GUIのGitツールでworktreeがサポートされているかをいくつか調べてみました。

アプリ 対応状況 補足
GitHub Desktop :x: まだサポートされていないようです。
Add support for treating worktrees like regular repos · Issue #907 · desktop/desktop · GitHub
Sourcetree :o: サポートされているようです。
[SRCTREE-3204] Add git 2.5 worktree command support - Create and track feature requests for Atlassian products.
VSCode :o: Extensionを入れることで使うことができます。
vscodeでgit worktreeを使う #Git - Qiita

参考にさせていただいた記事

運動通信社について

運動通信社は「日本を世界が憧れるスポーツ大国にする」というビジョンを達成するべく、一緒に働く仲間を募集しています!
PMやモバイルエンジニア、Webエンジニアなど色んな職種を募集しておりカジュアル面談大歓迎なので是非採用フォームよりご連絡ください!
ぜひ一緒に、自分たちも世の中もワクワクするサービスを作りましょう!

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?