AI時代のブランチ操作を最適化した――2026年5月

AIコーディング時代に突入して並行作業が増えた結果、次のような操作が増えました。

  • ブランチ作成・ワークツリー作成
  • tmuxウィンドウ作成
  • npm install
  • .envのシンボリックリンク
  • ペイン分割

こういった定型作業を全部手動でやっていたときは面倒でしたが、今は CLIや入力補完を駆使して ピアノを弾いているみたいな感覚で指に馴染んでいます。

でも「今後はもう少しAIに任せることが増えるかもしれないなぁ」と思ったので、2026年5月時点でのGitのブランチやワークツリー周りの操作を備忘録として残しておきます。

## 使うツールたち

この記事ではgtrやtmuxを扱いますが、他の類似ツールでも読み替えて適用できると思います。

## フロー

各操作とその設定を順に書いていきます。

### ブランチ&ワークツリーを作る

ブランチとワークツリーを用意するのは2パターンあるのでそれぞれについて書きます。

#### 今のブランチを切って作業ブランチを作る

gnewの後にスペースを打つと「ブランチ・ワークツリー作成」のコマンドが展開されます。

展開だけでまだ実行しない
gnew<space>
# ↓展開される
gtr new feature/
zeno.zshの設定
{
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
zeno.zshの設定
{
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-buz

prefixがリポジトリ名@になるようにしてます(vim-jpのどなたかの投稿で見て真似ました)。

### tmuxの新しいウィンドウでワークツリーを開く

towの後にスペースを打つと「指定したブランチ名のワークツリーを新しいウィンドウとして開く」という自作コマンドが展開されます。

展開だけでまだ実行しない
tow<space>
# ↓展開される
tmux-open-worktree
zeno.zshの設定
{
name: "tmux-open-worktree",
keyword: "tow",
snippet: "tmux-open-worktree",
},

実装は次のようにgtr goを利用しているだけです。

tmux-open-worktree
#!/bin/bash
if [ -z "$TMUX" ]; then
echo "Error: This command must be run inside tmux." >&2
exit 1
fi
if [ -z "$1" ]; then
echo "Usage: tmux-worktree <branch-name>" >&2
exit 1
fi
target_path=$(gtr go "$1" 2>/dev/null)
if [ -z "$target_path" ]; then
echo "Error: worktree not found for '$1'" >&2
exit 1
fi
tmux new-window -c "$target_path"

引数となるブランチ名は、zleのinsert-last-wordを使って^]の入力だけで補完されるように設定しています。

ブランチ名を補完して実行
tmux-open-worktree
# ↓^] を入力すると
# 最後に実行した`gtr`の引数=ブランチ名が補完される
tmux-open-worktree <ブランチ名>
.zshrc
autoload -Uz smart-insert-last-word
zstyle :insert-last-word match '*([[:alpha:]/\\]?|?[[:alpha:]/\\])*'
zle -N insert-last-word smart-insert-last-word
bindkey '^]' insert-last-word

tmux-open-worktreeの自作コマンドを「ブランチ・ワークツリー作成」とまとめていないのは、「急に新しいウィンドウが増えると気持ち悪い」という個人的な感覚のためです。

### ペイン構成を決めて作業開始

1ペイン&短時間で終わる作業なら、そのまま開始します。

一方で複数ペイン使ったり作業に時間がかかる場合はvde-layoutを呼び出します。

#### レイアウト適用とウィンドウ名変更

vdevの後にスペースを打つと「用意したレイアウトを適用しつつ、ウィンドウ名変更」のコマンドが展開されます。

Terminal window
vdev<space>
# ↓展開される
vde-layout dev && tmux rename-window "<CURSOR>"
zeno.zshの設定
{
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がプロセス停止しつつペインを閉じ、それが終わったらウィンドウを閉じる」というコマンドが展開されます。

Terminal window
gnew<space>
# ↓展開される
gtr new feature/
zeno.zshの設定
{
name: "close window safety",
keyword: "v:q",
snippet: "vde-layout empty && exit",
},
vde-layoutの設定
defaults:
windowMode: current-window
presets:
empty:
name: empty
description: プロセス終了用の単一ペイン
command: ""
windowMode: current-window

### 最後にブランチとワークツリーまとめて消す

grmの後にスペースを打つと「指定したブランチ名のワークツリー・ブランチを削除」のコマンドが展開されます。

Terminal window
grm
# ↓展開
gtr rm --delete-branch
zeno.zshの設定
{
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 <ブランチ名>
zeno.zshの補完設定
{
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に任せたり全然別のツールを使う可能性はあります。そのときは別の記事として書く予定です。