はじめに
Git Worktree は、ClaudeCodeやCodeXなどのAIコーディングエージェントによる並行開発ブームにより注目を集めています。
私自身も、最近、並行開発を実現するために Git Worktree を活用した開発を行っています。
しかし、コマンドの種類が多すぎて、毎回調べて使う状況になってしまいました。せっかく開発スピードが上がっても、コマンドを調べる時間がもったいない。
そこで、超簡単に呼び出せるように zsh にコマンドを登録して運用しています。
私はこれで調べる時間が減り、ラクになったので、Tipsとして記事に残しておこうと思います。
そもそも Git Worktree って?
従来の問題
通常、Gitでは複数の機能を並行開発する際、git switchでブランチを切り替えます。
しかし、これには問題があります:
-
切り替えのたびに作業中のファイルを
git stash(一時退避)する必要がある- 作業途中の変更を退避→別ブランチで作業→戻って復元、という手間が発生
-
コーディングエージェントを複数起動して並行開発できない
- 同じディレクトリで複数のエージェントを走らせると、お互いの変更が競合
-
ビルド済みファイルが消えて、毎回ビルドし直す必要がある
- ブランチを切り替えると
node_modulesなどが再生成され、時間がかかる
- ブランチを切り替えると
Git Worktreeで解決
Git Worktree(ワークツリー)は、1つのリポジトリに対して複数の作業ディレクトリを持てる機能です。
具体例:
-
feat-a/ディレクトリでfeat/Aブランチを操作 -
feat-b/ディレクトリでfeat/Bブランチを操作
ブランチ切り替え不要で、それぞれのディレクトリでコーディングエージェントを走らせられます。
feat-a/でClaudeにログイン機能を作ってもらいつつ、feat-b/でダッシュボードのバグ修正をする、といったことが可能になります。
詳しい解説
基本的な使い方は、こちらの記事がわかりやすいです。
https://zenn.dev/tmasuyama1114/articles/git_worktree_beginner
zsh の設定
設定内容
早速ですが、私が実際に使っている zsh の設定内容は以下のとおりです。
# git worktree shortcuts (zsh)
gwt() { git worktree "$@"; }
gwtl() { git worktree list; }
gwtp() { git worktree prune; }
# ブランチ名だけで worktree を作る(dir省略時は ../<repo名>-<branch>)
gwtnew() {
local b="$1"
local dir="${2:-../$(basename "$PWD")-$b}"
git fetch origin
git worktree add -b "$b" "$dir"
}
# 既存ブランチを worktree に追加
gwtadd() {
local b="$1"
local dir="${2:-../$(basename "$PWD")-$b}"
git worktree add "$dir" "$b"
}
# worktree を消して prune
gwtrm() {
local dir="$1"
git worktree remove "$dir" && git worktree prune
}
# ブランチ名だけで worktree を作り cd
gwtnewcd() {
local b="$1"
local dir="${2:-../$(basename "$PWD")-$b}"
git fetch origin
git worktree add -b "$b" "$dir" && cd "$dir"
}
# タブ補完の設定(コマンドの説明を表示)
_gwt_commands() {
local -a commands
commands=(
'gwt:git worktreeの生コマンド'
'gwtl:worktree一覧を表示'
'gwtp:削除されたworktreeの参照を掃除'
'gwtnew:新規ブランチ+worktree作成'
'gwtnewcd:新規ブランチ+worktree作成して移動'
'gwtadd:既存ブランチをworktreeに追加'
'gwtrm:worktreeを削除してprune'
)
_describe 'git worktree shortcuts' commands
}
compdef _gwt_commands gwt gwtl gwtp gwtnew gwtnewcd gwtadd gwtrm
設定方法
ここからは、zshの設定内容を順を追って説明します。
1. .zshrc を開く
エディタは何でもOK。
code ~/.zshrc
もし code が使えないなら(標準の nano):
nano ~/.zshrc
2. 末尾に設定を貼り付ける
.zshrc の一番下に設定を追記する。
設定内容 (再掲)
# git worktree shortcuts (zsh)
gwt() { git worktree "$@"; }
gwtl() { git worktree list; }
gwtp() { git worktree prune; }
# ブランチ名だけで worktree を作る(dir省略時は ../<repo名>-<branch>)
gwtnew() {
local b="$1"
local dir="${2:-../$(basename "$PWD")-$b}"
git fetch origin
git worktree add -b "$b" "$dir"
}
# 既存ブランチを worktree に追加
gwtadd() {
local b="$1"
local dir="${2:-../$(basename "$PWD")-$b}"
git worktree add "$dir" "$b"
}
# worktree を消して prune
gwtrm() {
local dir="$1"
git worktree remove "$dir" && git worktree prune
}
# ブランチ名だけで worktree を作り cd
gwtnewcd() {
local b="$1"
local dir="${2:-../$(basename "$PWD")-$b}"
git fetch origin
git worktree add -b "$b" "$dir" && cd "$dir"
}
# タブ補完の設定(コマンドの説明を表示)
_gwt_commands() {
local -a commands
commands=(
'gwt:git worktreeの生コマンド'
'gwtl:worktree一覧を表示'
'gwtp:削除されたworktreeの参照を掃除'
'gwtnew:新規ブランチ+worktree作成'
'gwtnewcd:新規ブランチ+worktree作成して移動'
'gwtadd:既存ブランチをworktreeに追加'
'gwtrm:worktreeを削除してprune'
)
_describe 'git worktree shortcuts' commands
}
compdef _gwt_commands gwt gwtl gwtp gwtnew gwtnewcd gwtadd gwtrm
nano の場合の保存
-
Ctrl + O→ Enter(保存) -
Ctrl + X(終了)
3. 反映する
source ~/.zshrc
4. 動作確認
リポジトリの中で以下を実行して、動作を確認する。
gwtl
出力例
/Users/username/myrepo abc123 [main]
一覧が表示されればOK。
5. タブ補完でコマンドを迷わない
これが重要:コマンドの途中で Tab を押すだけで、説明付きで候補が表示される。
コマンドを覚える必要がない。
例1: gwt のサブコマンド
gwt <Tab>
表示される補完候補
gwt
worktree command
add -- worktree追加
list -- worktree一覧
lock -- worktreeロック
move -- worktree移動
prune -- 参照の掃除
remove -- worktree削除
unlock -- worktreeロック解除
例2: すべてのカスタムコマンド
gwt<Tab>
表示される補完候補
git worktree shortcuts
gwt -- git worktreeの生コマンド
gwtadd -- 既存ブランチをworktreeに追加
gwtl -- worktree一覧を表示
gwtnew -- 新規ブランチ+worktree作成
gwtnewcd -- 新規ブランチ+worktree作成して移動
gwtp -- 削除されたworktreeの参照を掃除
gwtrm -- worktreeを削除してprune
何も覚えなくていい:
-
gwtで始まるコマンドを打ち始めて (半角スペース)Tabを押せば、全コマンドが説明付きで表示される - 「
git worktree addだっけ?git worktree newだっけ?」と迷う必要がなくなる - 「削除は
gwtrmだっけgwtremoveだっけ?」もTabで確認できる
使い方
全部の使い方を一覧にします。
基本は「元リポジトリ(main worktree:最初にgit cloneしたディレクトリ)」の中で実行してください。
1. gwt(生の git worktree を短く叩く)
gwt list
gwt add ...
gwt remove ...
gwt prune
2. gwtl(一覧)
今ある worktree を全部見る
gwtl
3. gwtp(掃除)
消されたパスなど、不要な参照を掃除
gwtp
4. gwtnew(新規ブランチ + worktree 作成)
ブランチを新規作成して worktree を作る(移動はしない)
gwtnew feat/login
- 作られるディレクトリ(デフォルト)
../<repo名>-feat/login
ディレクトリを指定する場合
gwtnew feat/login ../wt-login
5. gwtnewcd(新規ブランチ + worktree 作成 + 移動)
作ってそのまま worktree 側に移動
gwtnewcd feat/login
ディレクトリを指定する場合
gwtnewcd feat/login ../wt-login
6. gwtadd(既存ブランチを worktree に追加)
すでにあるブランチを worktree 化(ブランチは切らない)
gwtadd feat/login
ディレクトリ指定する場合
gwtadd feat/login ../wt-login
7. gwtrm(worktree 削除 + prune)
worktree ディレクトリを指定して削除
gwtrm ../<repo名>-feat/login
典型フロー
よく使うフローはこんな感じです。
1. 新しい作業を始める(作って移動)
gwtnewcd feat/login
2. 既存ブランチで並行作業を始める
gwtadd feat/login
cd ../<repo名>-feat/login
3. 作業が終わったら消す
(元リポジトリに戻ってから)
cd -
gwtrm ../<repo名>-feat/login
注意点
1. 同じブランチを2つの worktree で同時にチェックアウトできない
エラーが出たら、片方の worktree を gwtrm で削除するか、別ブランチ名にする。
# エラー例
fatal: 'feat/login' is already checked out at '/path/to/repo-feat/login'
2. gwtrm はパス指定が必要(ブランチ名ではない)
間違い
gwtrm feat/login # これは動かない
正しい
gwtrm ../<repo名>-feat/login
3. 削除時は必ず元リポジトリに戻る
worktree内で gwtrm を実行すると、ディレクトリごと消えて操作不能になる。
cd - # 元リポジトリに戻る
gwtrm ../<repo名>-feat/login
4. .gitignore は全 worktree で共有される
各 worktree で個別に .gitignore を設定することはできない。
おわりに
正直、Git Worktreeのコマンドは覚えきれない。
git worktree add -bだのgit worktree removeだの、毎回調べるのが面倒でした。
でもこの設定があれば、gwtnewcd feat/loginだけで即開発開始できます。
複数の機能を同時に作ってもらうときにとても便利です。
コーディングエージェントとの相性も抜群なので、並行開発する人はぜひ試してみてください!