🦩

月間350件のプルリクを捌きつつ、実装タスクも並列でこなすために必要だったものはやっぱりgit worktreeでした。

Dress Code Advent Calendar 2025、2日目の記事です🎉

私がgit worktreeを使うに至るまでの話と、worktreeを使う際のおすすめのツールを紹介します。AI系の話はしません。
よろしくお願いします!

https://adventar.org/calendars/12017

はじめに。

「タイトル盛りすぎだろw」と思われそうですが、DRESS CODE(弊社が展開しているSaaSの名称)の直近1ヶ月のPR数を確認したところ、なんと350件以上がマージされていました。

現在は2チーム体制で開発を行なっており、コードレビューはチーム内でクロスレビューで行なっています。そのため、自分の実装タスクを進めながらも、並行して大量のPRのレビューリクエストが飛んできます。

検証や提案のためにローカルでブランチをチェックアウトし、また自分の作業ブランチに戻りと繰り返し、気がつけばローカルにはアクティブなブランチが5個も10個も溜まっている状態になる日常を過ごしています。

そして、都度 git stash やセットアップをしたりする必要があり、スイッチングコストが馬鹿になりません。そんな問題に対しては git worktree を使えば解決しそうですが、、、

📷 githubで確認した月間のPR数
バックエンドのリポジトリの1ヶ月のPR数
バックエンドのリポジトリの1ヶ月のPR数

フロントエンドのリポジトリの1ヶ月のPR数
フロントエンドのリポジトリの1ヶ月のPR数

でも、worktreeのコマンドってちょっと長ったらしくない?

この課題は git worktree を使えば解決するのは分かっていました。しかし、worktreeのコマンド体系が苦手でどうしても手が伸びませんでした。

git worktree add ./worktree/feature-issue-123 feature/issue-123

この「パスを指定しつつブランチも指定する」という2段階入力が、頻繁に行う作業としてはストレスでした。(特に、パスとブランチ名に同じにしたいけど、パスを先に入力する必要があるし正しいブランチ名覚えてないし!ってなる点がストレスでした。)
VS Codeの拡張機能なども試しましたが、あまり気持ち良く使えるものに出会えず、CLIで何か良いものがないかと色々試した中で一番良かったのが gwq です。

gwqというworktreeの管理ツールが私の開発スタイルにマッチした。

gwqはworktreeの管理ツールの一つですが、次の点が便利で使い続けることにしました。

  • 直感的なコマンドやオプション、ディレクトリ構成である。
  • ブランチ名の入力が自動補完されたりインタラクティブに選択できて入力の手間がかからない。
  • 「ghq(gitのリポジトリの管理ツール)でリポジトリを管理、gwqでワークツリーを管理」と棲み分けができて馴染みやすい。

https://github.com/d-kuro/gwq

実際には、次のような使い方をしています。

  • 新しいタスクを始める際
    ワークツリーとブランチを作成してCursorで開く
    gwq add -b feature/my-new-taskgwq exec feature/my-new-task -- cursor .
  • 別タスクのレビュー指摘の対応をする際
    レビュー対象のワークツリーをCursorで開く
    gwq exec feature/my-other-task -- cursor .
  • レビュー依頼が飛んできた際
    PRのブランチのチェックアウト後にワークツリーを作成してCursorで開く
    gh pr checkout -dgwq add feature/pr-123gwq exec feature/pr-123 -- cursor .
    PRのブランチのチェックアウト後にワークツリーを作成して起動する
    gh pr checkout -dgwq add feature/pr-123gwq exec feature/pr-123 -- pnpm start

gwqの使用感をもう少しだけ。

基本的にはリポジトリ本体のディレクトリ(ワークツリーのディレクトリではない)でコマンドを実行します。

作成

ワークツリーを作成するときのコマンドはシンプルです。

# 既にあるブランチをワークツリーにする
gwq add ブランチ名

# もしくはブランチ名は入力せずにリストからの選択もできる
gwq add -i
# ブランチを新規作成してワークツリーにする
gwq add -b ブランチ名

レビューなどで既にブランチがある場合はbオプションなしで叩きます。

コマンド実行(⭐️便利)

また、特定のワークツリーに対してコマンドを実行することもできます。
対象のワークツリーのディレクトリを移動せずとも実行できる点がとても使いやすいです。

# feature-issue-123のワークツリーでアプリケーションを起動する
gwq exec feature-issue-123 -- npm run start

# feature-issue-456のワークツリーでエディタを開く
gwq exec feature-issue-456 -- code .
gwq exec feature-issue-456 -- nvim .

削除

ワークツリーを削除するときのコマンドです。

# インタラクティブにワークツリーを消す
gwq remove
gwq remove ブランチ名

一覧

ワークツリーの一覧も見やすいです。

gwq status
 ┌─────────────────────┬────────────┬─────────────┬────────────┐
 │ BRANCH              │ STATUS     │ CHANGES     │ ACTIVITY   │
 ├─────────────────────┼────────────┼─────────────┼────────────┤
 │   develop           │ up to date │ -           │ 3 mins ago │
 │   feature/issue-123 │ changed    │ 2 untracked │ just now   │
 │   feature/issue-456 │ up to date │ -           │ 1 min ago  │
 └─────────────────────┴────────────┴─────────────┴────────────┘

ディレクトリ構成

ワークツリーは以下のように、host→user/organization→repository→branchの階層で自動的に作成されます。

~
└── worktree
    ├── github.com
    │   ├── dresscode
    │   │   ├── dresscode-backend
    │   │   │   ├── develop
    │   │   │   ├── feature-issue-123
    │   │   │   └── feature-issue-456
    │   │   └── dresscode-frontend
    │   │       ├── develop
    │   │       └── hotfix-issue-987
    │   └── shinoda-yosuke
    └── gitlab.com

終わりの一言。

gwqって文字をずっと見てると、泣いてる顔に見えてきます。

DRESS CODE TECH BLOG

Discussion