# 写在前面

最近用 Claude Code 写代码的频率越来越高,有时候会同时开三四个任务:一个在修 bug,一个在加新功能,一个在 review 中,还有一个在跑测试验证新点子。问题来了:它们都需要独立的工作目录,不然会互相串代码。

Git 的 worktree 功能本来就是为这种场景设计的,但原生命令实在有些啰嗦。传统创建一个新 worktree 要这样:

git worktree add -b feature-auth ../myproject-feature-auth
cd ../myproject-feature-auth

删掉它又得回到主目录:

cd ../myproject
git worktree remove ../myproject-feature-auth
git branch -d feature-auth

分支名要输三次,每次都要手动 cd 。干这事儿多了,会觉得有些浪费生命,这也是我之前为什么不喜欢 worktree。

直到发现 Worktrunk,才发现 worktree 管理原来可以这么优雅(当然还有很多别的工具)。

https://x.com/max_sixty/status/2006077845391724739

用下来感觉非常好,写一篇博客卖一卖安利。

# Worktrunk 是什么

简单来说,Worktrunk 是一个 Git Worktree 的 CLI 包装工具,专门为并行运行多个 AI Agent 的场景优化。它的核心理念是:

每个 worktree 对应一个分支,用分支名管理 worktree,路径自动生成。

对比一下命令差异就能感受到差异:

任务Worktrunk原生 Git
切换到某个 worktreewt switch featcd ../repo.feat
创建 worktree + 启动 Claudewt switch -c -x claude featgit worktree add -b feat ../repo.feat && cd ../repo.feat && claude
清理当前 worktreewt removecd ../repo && git worktree remove ../repo.feat && git branch -d feat
列出所有 worktree 状态wt listgit worktree list (只显示路径)

基本就是把 git worktree 的操作复杂度从「记三个参数」降到「说个分支名」。

# 为什么需要 Worktrunk?

如果你只是偶尔用一下 worktree,原生命令当然就行了。但当你需要频繁并行开发(比如同时跑多个 AI Agent)或者需要自动化流程(创建 worktree 后自动装依赖、跑测试)的时候,Worktrunk 能省下不少时间和心智负担。它本质上是把「用 worktree 的正确姿势」固化成了工具。

# 安装与配置

# 安装

macOS/Linux (推荐 Homebrew):

brew install max-sixty/worktrunk/wt

或者用 Cargo:

cargo install worktrunk

# Shell 集成

装完之后必须跑这一步,否则 wt switch 无法切换目录:

wt config shell install

它会在你的 .zshrc.bashrc 里加一段函数,让 wt 命令可以改变当前 shell 的工作目录。

装完重启终端,跑 wt --version 确认安装成功。

# 核心命令详解

# wt switch - 切换 / 创建 Worktree

wt switch | Worktrunk

这是最常用的命令,用法极简:

# 切换到已存在的 worktree (分支名 feat)
wt switch feat
# 基于主分支 main 创建新 worktree + 分支 feat
wt switch -c feat
# 创建 worktree + 自动启动 Claude Code
wt switch -c feat -x claude
# 基于 dev 分支创建新 worktree + 分支 feat-new (而不是 main) + 自动启动 claude
wt switch -c feat-new -b dev -x claude

路径规则: Worktrunk 会自动在主仓库的同级目录下创建 worktree,命名格式是 <repo>.<branch> 。比如主仓库在 ~/code/myproject ,分支 feat 的 worktree 就在 ~/code/myproject.feat

参数说明

  • -c / --create :创建新 worktree + 分支
  • -x <cmd> :切换后自动执行命令 (比如 claude , code , npm install )
  • -b <base> :指定基础分支 (默认是 main )
Shortcut含义
^默认分支(main/master)
@当前分支 / 工作树
-之前的工作目录(例如 cd -
wt switch -                      # Back to previous
wt switch ^                      # Default branch worktree
wt switch --create fix --base=@  # Branch from current HEAD

# 实战场景

假设你在跑三个并行任务:

# Terminal 1: 修复认证 bug
wt switch -c -x claude fix-auth
# Terminal 2: 重构 API
wt switch -c -x claude refactor-api
# Terminal 3: 加新功能
wt switch -c -x claude feat-dashboard

每个 Claude 实例跑在独立目录里,互不干扰。

# wt list - 查看所有 Worktree

wt list | Worktrunk

wt list

输出大概长这样:

wt list
  Branch       Status        HEAD±    main↕  Remote⇅  Commit    Age   Message
@ feature-api  +   ↕⇡     +54   -5   ↑4  ↓1   ⇡3      ec97decc  30m   Add API tests
^ main             ^⇅                         ⇡1  ⇣1  6088adb3  4d    Merge fix-auth: hardened to…
+ fix-auth         ↕|                ↑2  ↓1     |     127407de  5h    Add secure token storage
○ Showing 3 worktrees, 1 with changes, 2 ahead, 1 column hidden

比原生 git worktree list 强很多,可以看到很多信息

  • Git 状态:有多少未提交 / 未追踪文件
  • CI 状态:如果配置了 GitHub Actions, 会显示最新的构建状态

对于管理多个 worktree 来说,这个视图非常实用。

# wt remove - 清理 Worktree

wt remove | Worktrunk

# 删除当前 worktree + 分支
wt remove
# 删除指定 worktree
wt remove feature-branch
wt remove old-feature another-branch
# 删除 worktree 但保留分支
wt remove --no-delete-branch feature-branch
# 强制删除未合并的分支
wt remove -D experimental

# wt merge - 合并工作流

wt merge | Worktrunk

这个命令封装了「合并 → 清理」的完整流程:

# 把当前 worktree 合并到默认分支 如 main
wt merge
# 把当前 worktree 合并到 dev 分支
wt merge dev
# 合并后保留工作树
wt merge --no-remove
# 保留提交历史(不合并)
wt merge --no-squash
# 跳过提交 / 合并(除非使用 --no-rebase 参数,否则 rebase 仍会运行)
wt merge --no-commit

如果配置了 pre-merge hook,会在合并前自动跑测试或 lint。

# wt select - 交互式选择器

wt select | Worktrunk

如果你记不清 worktree 名字,可以用 select 命令:

wt select

会弹出一个 fzf 风格的界面,用方向键选择要切换的 worktree。

# Hooks

wt hook | Worktrunk

Worktrunk 支持在 worktree 生命周期的不同阶段执行命令,同时支持全局用户 hook 配置( ~/.config/worktrunk/config.toml  )和项目 hook 配置(  .config/wt.toml
好的,我只给你补充 Hook 系统这一段内容:

# Hook 类型一览

Hook触发时机阻塞模式失败即停
post-createworktree 创建后
post-startworktree 创建后否 (后台)
post-switch每次切换后否 (后台)
pre-commitmerge 时提交前
pre-merge合并到目标分支前
post-merge合并成功后
pre-removeworktree 删除前

阻塞模式:命令执行完成前,主流程会等待
失败即停:第一个失败的命令会中止整个操作

# 核心 Hooks 说明

post-create - worktree 创建后立即执行,会阻塞直到完成:

[post-create]
install = "npm ci"                    # 安装依赖
migrate = "npm run db:migrate"        # 数据库迁移
env = "cp .env.example .env"          # 复制环境配置

post-start - worktree 创建后在后台执行,不阻塞切换:

[post-start]
build = "npm run build"               # 构建项目
server = "npm run dev"                # 启动开发服务器

日志输出到 .git/wt-logs/{branch}-{source}-post-start-{name}.log

post-switch - 每次 wt switch 后在后台执行 (无论是新建、切换还是切到当前):

post-switch = "echo 'Switched to '"

pre-commit - merge 时提交前执行,失败即停:

[pre-commit]
format = "cargo fmt -- --check"       # 代码格式检查
lint = "cargo clippy -- -D warnings"  # Lint 检查

pre-merge - 合并到目标分支前执行,失败即停:

[pre-merge]
test = "cargo test"                   # 运行测试
build = "cargo build --release"       # 生产构建

post-merge - 合并成功后在目标分支的 worktree 执行 (如果存在), 否则在主 worktree 执行:

post-merge = "cargo install --path ."

pre-remove - worktree 删除前执行,失败即停:

[pre-remove]
cleanup = "rm -rf /tmp/cache/"

# 模板变量

Hook 命令支持模板变量,运行时自动展开:

变量示例说明
{{ repo }}my-project仓库名
{{ branch }}feature-foo分支名
{{ worktree }}/path/to/worktreeworktree 绝对路径
{{ worktree_name }}my-project.feature-fooworktree 目录名
{{ repo_root }}/path/to/main主仓库根路径
{{ default_branch }}main默认分支名
{{ commit }}a1b2c3d4e5f6...HEAD 完整 SHA
{{ short_commit }}a1b2c3dHEAD 短 SHA
{{ remote }}origin主远程名称
{{ remote_url }}[email protected]:user/repo.git远程 URL
{{ upstream }}origin/feature上游跟踪分支
{{ target }}main目标分支 (仅 merge hooks)

# 安全机制

项目 hook ( .config/wt.toml ) 首次运行需要用户批准:

▲ repo needs approval to execute 3 commands:
○ post-create install:
  echo 'Installing dependencies...'
❯ Allow and remember? [y/N]
  • 批准记录保存在用户配置中
  • 命令变更需要重新批准
  • --yes 跳过提示 (适用于 CI)
  • --no-verify 完全跳过 hooks

管理批准记录:

wt hook approvals add      # 预批准当前项目所有命令
wt hook approvals clear    # 清除当前项目批准
wt hook approvals clear --global  # 清除全局批准

# 用户级 Hooks

~/.config/worktrunk/config.toml 中配置的 hook 会对所有仓库生效,且不需要批准:

维度项目 hook用户 hook
配置位置.config/wt.toml~/.config/worktrunk/config.toml
作用范围单个仓库所有仓库
需要批准
执行顺序后执行先执行

我觉得看下来,这个 hook 非常重要,可以复用主 worktree 的缓存:

[post-create]
# 软链接 node_modules 避免重复安装
cache = "ln -sf /node_modules node_modules"
env = "cp /.env.local .env"

# 独立运行 Hooks

除了自动触发,也可以手动运行 hook 进行测试或重试:

wt hook pre-merge           # 运行 pre-merge hooks
wt hook pre-merge --yes     # 跳过批准提示 (适用于 CI)
wt hook show                # 查看所有已配置的 hooks

适用场景: Hook 开发测试、CI 流水线、失败后重试等。

# Claude Code 插件监测状态

claude plugin marketplace add max-sixty/worktrunk
claude plugin install worktrunk@worktrunk

# 手动设置状态标记

除了自动追踪 Claude 状态,你也可以手动给 worktree 设置任何标记,用于其他工作流:

# 给当前分支设置标记
wt config state marker set "🚧"
# 给指定分支设置标记
wt config state marker set "✅" --branch feature
# 直接操作 Git Config (高级用法)
git config worktrunk.state.feature.marker '{"marker":"💬","set_at":0}'

# Statusline 状态栏

wt list statusline --claude-code 可以输出一行紧凑的状态信息,用于 Claude Code 的状态栏显示:

~/w/myproject.feature-auth !🤖 @+42 -8 ↑3 ⇡1 ● | Opus

# LLM Commit Messages 自动生成提交信息

LLM Commit Messages | Worktrunk

Worktrunk 可以调用 LLM 自动生成 commit message,集成在 wt mergewt step commitwt step squash 等命令中。

不配置也能用,默认会基于文件名生成简单的 message,但配置 LLM 后能生成更有意义的提交信息。

# 安装与配置

1. 安装 llm 工具

使用的是 llm

uv tool install -U llm
# 或者直接 brew
brew install llm

2. 配置 API Key

选择你喜欢的 LLM 提供商:

# 使用 Claude (推荐)
llm install llm-anthropic
llm keys set anthropic
# 输入你的 Anthropic API Key
# 或者使用 OpenAI
llm keys set openai
# 输入你的 OpenAI API Key

3. 配置 Worktrunk

创建配置文件(如果还没有):

wt config create

编辑 ~/.config/worktrunk/config.toml ,添加:

[commit-generation]
command = "llm"
args = ["-m", "claude-3-5-haiku-latest"]  # 或 gpt-4o-mini

# 使用场景

配置完成后,以下命令会自动生成 commit message:

场景 1: 合并分支时生成 squash commit

$ wt merge
◎ Squashing 3 commits into a single commit (5 files, +48)...
◎ Generating squash commit message...
   feat(auth): Implement JWT authentication system
   - Add JWT token generation and validation
   - Implement refresh token mechanism
   - Add middleware for protected routes

场景 2: 提交当前变更

$ wt step commit
◎ Generating commit message...
   fix(api): Handle null response in user endpoint

场景 3: 把多个 commit 压缩成一个

$ wt step squash
◎ Squashing 5 commits...
◎ Generating squash commit message...
   refactor(ui): Modernize component architecture

# 使用其他 AI 工具

除了 llm ,任何能从 stdin 读取提示词并输出文本的工具都行:

# 使用 aichat
[commit-generation]
command = "aichat"
args = ["-m", "claude:claude-3-5-haiku-latest"]
# 使用自定义脚本
[commit-generation]
command = "./scripts/generate-commit.sh"

# Fallback 行为

如果没配置 LLM,Worktrunk 会生成基于文件名的简单 message:

Changes to auth.rs & config.rs

# CI 状态集成

如果你用 GitHub Actions,Worktrunk 可以在 wt list 里显示构建状态:

# 配置 GitHub Token
wt config github.token "ghp_xxxxxxxxxxxx"
# 之后 wt list 就会显示 CI 状态
wt list

# 实战工作流

# 并行跑多个 Claude Code

假设你在用 Zellij 或 Tmux 管理多个终端窗口:

# Pane 1: 修 bug
wt switch -c -x claude fix-login-bug
# Pane 2: 重构
wt switch -c -x claude refactor-utils
# Pane 3: 新功能
wt switch -c -x claude feat-export

每个 Claude 在独立目录里工作,你可以随时切回主目录看全局状态:

wt switch main
wt list

# 临时验证想法

有时候你想快速验证一个想法,但不想污染当前分支:

# 创建临时 worktree
wt switch -c -x code experiment
# 验证完毕,直接删掉
wt remove

因为 worktree 是独立目录,删掉不会影响其他分支。

# Review PR 时跑代码

有 PR 来了,你想在本地跑一下代码:

# 基于 PR 分支创建 worktree
wt switch -c review-pr-123 -b origin/pr-123
# 装依赖、跑测试
npm install
npm run test
# Review 完毕,清理
wt remove

# 参考资料

  • Worktrunk 官网
  • Anthropic - Claude Code Best Practices (官方推荐的 worktree 工作流)
  • incident.io - Shipping faster with Claude Code and Git Worktrees
  • Git Worktree 官方文档
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

cos 微信支付

微信支付

cos 支付宝

支付宝