2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Git Worktree コマンドを気合と根性で覚えないために zshでらくらくコマンド化!

Posted at

はじめに

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だけで即開発開始できます。
複数の機能を同時に作ってもらうときにとても便利です。

コーディングエージェントとの相性も抜群なので、並行開発する人はぜひ試してみてください!

2
3
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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?