🌿

Cursor のアップデートで知った git worktree の便利さ - 並行開発が劇的に楽になった話

に公開

Cursor のアップデートで知った git worktree の便利さ - 並行開発が劇的に楽になった話

本記事のサマリ

Cursor IDE のアップデートで git worktree 機能に触れる機会があり、これまで勘違いしていた概念を正しく理解できました。複数回 git clone したりセットアップしたりが面倒そうだなーと思っていましたが、実際は一つのリポジトリから複数の作業ディレクトリを手軽に作成でき、並行開発が格段に効率化されることがわかりました。

きっかけは Cursor のアップデート

最近の Cursor のアップデートで、プロジェクトを開く際に「Local」と「Worktree」を選択できるようになりました。これまでなんとなく worktree という言葉は聞いたことがあったものの、具体的にどう便利なのかピンと来ていませんでした。

Cursor の選択画面

セットアップスクリプト設定画面

「Worktree」を選択すると、自動的に ~/.cursor 配下に別のワークスペースが作成され、事前に設定したセットアップスクリプト(上の画像のように npm install など)が実行されます。この時点で「あ、これは単純にディレクトリをコピーしているわけじゃないな」と気づき始めました。

git worktree を誤解していた

恥ずかしながら、これまで git worktree について大きな勘違いをしていました。並行開発をするには複数回 git clone を実行して、それぞれ別のディレクトリで作業する必要があると思っていたのです。つまり、面倒な作業が増えるだけだと考えていました。

実際には全く違いました。git worktree は一つのリポジトリから複数の作業ディレクトリを効率的に管理する仕組みで、.git ディレクトリは共有されます。つまり、リモートの情報や履歴は同期されたまま、異なるブランチで並行して作業ができるということです。

Git の公式ドキュメントでも、worktree の目的は「同じリポジトリの複数のブランチを同時にチェックアウトすること」と明確に記されています。

https://git-scm.com/docs/git-worktree

実際に使ってみてわかったこと

git worktree list を実行すると、現在管理されている worktree の一覧が表示されます。

git worktree list の実行結果

$ git worktree list
/Users/totoinu/worker/challenges/meditation_app                f0fb1f0 [main]
/Users/totoinu/.cursor/worktrees/meditation_app/ux3gF         f0fb1f0 [feat-nativewind-ui-counter-ux3gF]

この出力を見ると、メインの作業ディレクトリと、新しい機能開発用の worktree が並行して存在していることがわかります。Cursor では、このパスをクリックするだけで別のエディタウィンドウが開き、瞬時に作業を切り替えられるのが特に便利でした。

実際に開発していて感じたのは、hotfix や緊急対応が必要になった時の切り替えの速さです。従来であれば現在の作業をいったんコミットするか stash して、ブランチを切り替える必要がありました。worktree を使えば、作業中のファイルはそのままに、別のブランチでの作業にすぐ移れます。

fish での alias 設定

コマンドをできるだけ省略したい私なので、例に漏れずgit worktreeもfishのaliasとして設定しました。
参考までに内容を添付します。

fish の alias 設定

# ~/.config/fish/conf.d/git.fish

# ----- git worktree -----
alias gwtl='git worktree list'                             # ワークツリー一覧
alias gwtadd='git worktree add'                             # 新しいワークツリー追加: gwtadd ../develop develop
alias gwtaddb='git worktree add -b'                         # ブランチ新規作成して追加: gwtaddb feature/new ../feature-new
alias gwtrm='git worktree remove'                           # ワークツリー削除
alias gwtprune='git worktree prune'                         # 壊れたワークツリーを整理
alias gwtmv='git worktree move'                             # パス移動(必要に応じて)

# --- help ---
alias gfish='cat ~/.config/fish/conf.d/git.fish'

alias は help がないと困るので、gfish というヘルパーも追加しています。慣れるまでは gfish | grep worktree で一覧を確認しながら使っていました。

基本的な使い方としては、新しい機能開発の場合は:

gwtaddb feature/new-ui ../feature-new-ui

既存のブランチで作業する場合は:

gwtadd ../hotfix hotfix/urgent-bug

といった感じになります。

Cursor での実際の使い方

Cursor で「Worktree」を選択した場合、以下のような流れになります:

  1. プロジェクトを選択し、「Worktree」オプションを選択
  2. 自動的に ~/.cursor/worktrees/ 配下に新しい作業ディレクトリが作成される
  3. 事前設定したセットアップスクリプト(例:npm install)が自動実行される
  4. 新しい Cursor ウィンドウで、独立した開発環境が立ち上がる

この時点で、元の作業とは完全に切り分けられた環境で開発を開始できます。依存関係のインストールも自動で行われるため、すぐにコーディングに集中できるのが良い点です。

特に AI ペアプログラミングをする際、コンテキストが混在しないのは大きなメリットでした。別の機能の実装について相談している最中に、緊急の修正依頼が来ても、新しい worktree で対応して、また元の作業に戻れます。

worktree の削除

worktree を削除する際は、git worktree list で表示されるパス末尾の ID を指定します。

gwtrm ~/.cursor/worktrees/meditation_app/ux3gF

ただし、削除前に該当の worktree で作業中のファイルがある場合は、事前にコミットまたは stash しておく必要があります。これは当然といえば当然ですが、最初は少し戸惑いました。

また、何らかの理由で worktree のディレクトリが破損した場合は、gwtprune で整理できます。これは定期的に実行しておくと良いかもしれません。

まとめ

git worktree は、これまで思っていたよりもはるかに実用的で、日常の開発フローに組み込みやすい機能でした。

複数の機能を並行開発している時、緊急対応が必要になった時、実験的な実装を試したい時など、ブランチの切り替えコストを気にせず作業できるのは快適ですね!

Cursor のような AI 対応エディタとの組み合わせでは、コンテキストの切り替えもスムーズになり、より集中して開発に取り組めるようになりました。まだ worktree を使ったことがない方は、一度試してみることをお勧めします。思っているより簡単です!

株式会社StellarCreate | Tech blog📚

Discussion