AI時代のブランチ操作を最適化した――2026年5月
AIコーディング時代に突入して並行作業が増えた結果、次のような操作が増えました。
- ブランチ作成・ワークツリー作成
- tmuxウィンドウ作成
npm install- .envのシンボリックリンク
- ペイン分割
こういった定型作業を全部手動でやっていたときは面倒でしたが、今は CLIや入力補完を駆使して ピアノを弾いているみたいな感覚で指に馴染んでいます。
でも「今後はもう少しAIに任せることが増えるかもしれないなぁ」と思ったので、2026年5月時点でのGitのブランチやワークツリー周りの操作を備忘録として残しておきます。
## 使うツールたち
- zeno.zsh
- コマンド入力が爆速 になるZsh・Fishのプラグイン
- このブログでも紹介済み
- vde-layout
- ターミナルのレイアウトをYAMLファイルで宣言的に定義して、コマンドを叩くだけで サクッとレイアウトを適用できる ツール
- 紹介記事:vde-layoutの使い方――tmuxのレイアウトをコマンド一発で再現
- git-worktree-runner(gtr)
- Gitワークツリー管理CLI
この記事ではgtrやtmuxを扱いますが、他の類似ツールでも読み替えて適用できると思います。
## フロー
各操作とその設定を順に書いていきます。
### ブランチ&ワークツリーを作る
ブランチとワークツリーを用意するのは2パターンあるのでそれぞれについて書きます。
#### 今のブランチを切って作業ブランチを作る
gnewの後にスペースを打つと「ブランチ・ワークツリー作成」のコマンドが展開されます。
gnew<space># ↓展開されるgtr new feature/ { name: "gtr new local", keyword: "gnew", snippet: "gtr new feature/{{}}", },{{}}の位置にカーソルが飛ぶのでそのまま入力するか、fix/とかの場合は^w(zleのbackward-kill-word)で消してから入力します。
gtr new feature/foo#### レビュー用ブランチをローカルへ
レビュー用にリモートブランチをローカル化するパターン。
gnewの後にスペースを打つと「リモートブランチを取得してワークツリー作成」のコマンドが展開されます。
コマンドの最後にリモートブランチの名前を貼り付けて実行します。
gremote# ↓展開gtr new --track remote { name: "gtr new --track remote", keyword: "gremote", snippet: "gtr new --track remote", },gtr new --track remote feature/foo### ワークツリー作成後の処理は自動で
ワークツリーを作成したら、ライブラリのインストールや.envの用意などが必要です。
こういう作業はワークツリー管理のCLIに任せます。
たとえばgtrを使う場合は、あらかじめ次のような設定を仕込みます。
[gtr "worktrees"] prefix = reponame@ dir = ../[gtr] defaultBranch = development[gtr "hook"] postCreate = ln -s "$(git rev-parse --path-format=relative --git-common-dir | xargs dirname)/.mywork" .mywork postCreate = ln -s "$(git rev-parse --path-format=relative --git-common-dir | xargs dirname)/mise.local.toml" mise.local.toml && mise trust postCreate = yarn install筆者はghqで探しやすくするために、ワークツリーは次のように配置しています。
~/ghq/github.com/example-user├── example├── example@feature-foo├── example@feature-bar└── example@fix-buzprefixがリポジトリ名@になるようにしてます(vim-jpのどなたかの投稿で見て真似ました)。
### tmuxの新しいウィンドウでワークツリーを開く
towの後にスペースを打つと「指定したブランチ名のワークツリーを新しいウィンドウとして開く」という自作コマンドが展開されます。
tow<space># ↓展開されるtmux-open-worktree { name: "tmux-open-worktree", keyword: "tow", snippet: "tmux-open-worktree", },実装は次のようにgtr goを利用しているだけです。
#!/bin/bash
if [ -z "$TMUX" ]; then echo "Error: This command must be run inside tmux." >&2 exit 1fi
if [ -z "$1" ]; then echo "Usage: tmux-worktree <branch-name>" >&2 exit 1fi
target_path=$(gtr go "$1" 2>/dev/null)
if [ -z "$target_path" ]; then echo "Error: worktree not found for '$1'" >&2 exit 1fi
tmux new-window -c "$target_path"引数となるブランチ名は、zleのinsert-last-wordを使って^]の入力だけで補完されるように設定しています。
tmux-open-worktree# ↓^] を入力すると# 最後に実行した`gtr`の引数=ブランチ名が補完されるtmux-open-worktree <ブランチ名>autoload -Uz smart-insert-last-wordzstyle :insert-last-word match '*([[:alpha:]/\\]?|?[[:alpha:]/\\])*'zle -N insert-last-word smart-insert-last-wordbindkey '^]' insert-last-wordtmux-open-worktreeの自作コマンドを「ブランチ・ワークツリー作成」とまとめていないのは、「急に新しいウィンドウが増えると気持ち悪い」という個人的な感覚のためです。
### ペイン構成を決めて作業開始
1ペイン&短時間で終わる作業なら、そのまま開始します。
一方で複数ペイン使ったり作業に時間がかかる場合はvde-layoutを呼び出します。
#### レイアウト適用とウィンドウ名変更
vdevの後にスペースを打つと「用意したレイアウトを適用しつつ、ウィンドウ名変更」のコマンドが展開されます。
vdev<space># ↓展開されるvde-layout dev && tmux rename-window "<CURSOR>" { name: "create & rename window for development", keyword: "vdev", snippet: 'vde-layout dev && tmux rename-window "{{}}"', },{{}}の位置にカーソルが飛ぶのでそのままウィンドウ名を入力します。
vde-layoutは別の記事vde-layoutの使い方――tmuxのレイアウトをコマンド一発で再現に書いたのでこちらをご覧ください。
「APIのリポジトリならAのレイアウト」「アプリ開発はBのレイアウト」みたいなことができます。ペイン分割やサイズだけなく、実行するコマンドまで指定できるので楽です。
### 作業終了したらウィンドウを閉じる
ウィンドウをプロセス停止してから閉じるのが面倒なので、これもvde-layoutで閉じます。
v:qの後にスペースを打つと「vde-layoutがプロセス停止しつつペインを閉じ、それが終わったらウィンドウを閉じる」というコマンドが展開されます。
gnew<space># ↓展開されるgtr new feature/ { name: "close window safety", keyword: "v:q", snippet: "vde-layout empty && exit", },defaults: windowMode: current-windowpresets: empty: name: empty description: プロセス終了用の単一ペイン command: "" windowMode: current-window### 最後にブランチとワークツリーまとめて消す
grmの後にスペースを打つと「指定したブランチ名のワークツリー・ブランチを削除」のコマンドが展開されます。
grm# ↓展開gtr rm --delete-branch { name: "gtr rm --delete-branch", keyword: "grm", snippet: "gtr rm --delete-branch", },#### ブランチ名の補完:insert-last-wordを使う方法
「ブランチ・ワークツリー作成」やtowと同じペインが残っているなら履歴が残っているため、前述のinsert-last-wordを使ってブランチ名を補完できます。
# すでに gtr new や towを実行済みの場合gtr rm --delete-branch# ↓insert-last-wordの入力で# 最後に実行した`tmux-open-worktree`の引数=ブランチ名が補完されるgtr rm --delete-branch <ブランチ名>#### ブランチ名の補完:insert-last-wordを使う方法
一方で作成から時間が経つケースもあります。そんなときは<Tab>を押してzeno.zshの補完を発動させます。
gtr rm --delete-branch# ↓<Tab>でzeno経由のfzfが開き、補完gtr rm --delete-branch <ブランチ名> { name: "branch names", patterns: [ "^gtr rm --delete-branch $", "^gtr rm $", "^tmux-open-worktree $", ], sourceCommand: "git gtr list --porcelain | awk '!/detached/{print $2}'", options: { "--header-lines": 1, "--tmux": "80%", "--prompt": "'Delete branch> '", "--no-select-1": true, "--preview": "git log --color=always --oneline -20 {} 2>/dev/null", "--preview-window": "right,55%,wrap", }, },冒頭に書いたとおり2026年5月時点でのフローです。
「あのときはこうだったなぁ」という思い出を残したい半分、まだzenoとか知らない人がいたら使ってほしいなという布教半分で書きました。
今後AIに任せたり全然別のツールを使う可能性はあります。そのときは別の記事として書く予定です。