关于 worktree
worktree 是用于并行分支开发的 Git worktree 管理技能,支持创建、列出、变基、合并和移除 worktree,并在操作前执行安全检查。
主要功能
- 01为新分支创建 worktree
- 02列出 Git worktree
- 03将分支合并到 main
- 04将分支变基到 main
- 05移除已合并的 worktree 和分支
- 06变更前检查安全条件
适用场景
- 01并行开发多个分支
- 02将功能分支变基到最新 main
- 03把 worktree 分支合并到 main
- 04清理已合并的 worktree
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jimweller/ clanker-skills --skill worktree安装后在 Claude Code 中输入/worktree确认已加载。
详细介绍
STARTER_CHARACTER = 🎋
Git Worktree 管理
管理用于并行分支开发的 git worktree。Worktree 位于 ~/.worktrees/<repo>/<branch> 下。分支名称中的斜杠会创建嵌套目录(例如,feature/foo 会变成 ~/.worktrees/<repo>/feature/foo)。
参数
从用户消息中提取操作和分支名称。
第一个参数是操作。第二个参数是分支名称(create、merge、rebase、remove 操作必需)。
如果未指定操作,默认使用 list。
路径发现
所有操作都根据 git 确定路径,而不是通过 dirname 计算。
PRIMARY=$(git worktree list --porcelain | awk '/^worktree / { print $2; exit }')
REPO_NAME=$(basename "$PRIMARY")
WORKTREE_DIR="$HOME/.worktrees/$REPO_NAME/<branch>"
PRIMARY 是原始克隆(git worktree list 中的第一项)。其他 worktree 位于 ~/.worktrees/$REPO_NAME/ 下。
操作
create
在 ~/.worktrees/<repo>/<branch> 下创建一个带新分支的 worktree。如果主 worktree 中存在 .llmtmp/,则将其复制过去。如果在 tmux 中运行,则打开一个名为 wt:<branch> 的新 tmux 窗口。不会切换焦点。
PRIMARY=$(git worktree list --porcelain | awk '/^worktree / { print $2; exit }')
REPO_NAME=$(basename "$PRIMARY")
WORKTREE_DIR="$HOME/.worktrees/$REPO_NAME/<branch>"
mkdir -p "$(dirname "$WORKTREE_DIR")"
git worktree add "$WORKTREE_DIR" -b <branch>
[ -d "$PRIMARY/.llmtmp" ] && cp -r "$PRIMARY/.llmtmp" "$WORKTREE_DIR/.llmtmp"
[ -n "$TMUX" ] && tmux new-window -d -n "wt:<branch>" -c "$WORKTREE_DIR"
创建后,报告 worktree 路径以及 tmux 窗口编号(如果已创建)。
list
显示所有 worktree。
git worktree list
merge
将当前 worktree 的分支合并到 main。请从功能 worktree 中运行。
预检查:确认当前分支不是 main。如果当前分支是 main,则拒绝操作。
PRIMARY=$(git worktree list --porcelain | awk '/^worktree / { print $2; exit }')
BRANCH=$(git rev-parse --abbrev-ref HEAD)
git -C "$PRIMARY" fetch origin && git -C "$PRIMARY" pull
git -C "$PRIMARY" merge "$BRANCH"
git -C "$PRIMARY" push origin main
如果发生冲突,请先帮助用户解决冲突,再推送。
rebase
将分支变基到最新的 main 上。必须在该分支的 worktree 内运行。
预检查:确认当前分支与 <branch> 一致。如果不一致,则拒绝操作并指导用户切换到正确的 worktree。
git fetch origin
git rebase origin/main
如果发生冲突,请帮助用户解决。变基成功后,如果该分支之前已推送,则必须强制推送(仅可在根据安全规则获得明确许可后执行)。
remove
移除 worktree 并删除其分支。必须从主 worktree 中运行。
预检查:
- 确认当前目录是主 worktree(
git rev-parse --show-toplevel等于$PRIMARY)。如果不是,则拒绝操作。 - 使用
git branch --merged确认该分支已合并到 main。如果尚未合并,则拒绝操作并指导用户先合并。
PRIMARY=$(git worktree list --porcelain | awk '/^worktree / { print $2; exit }')
REPO_NAME=$(basename "$PRIMARY")
WORKTREE_DIR="$HOME/.worktrees/$REPO_NAME/<branch>"
git worktree remove "$WORKTREE_DIR"
git branch -d <branch>
PARENT="$(dirname "$WORKTREE_DIR")"
while [ "$PARENT" != "$HOME/.worktrees" ] && rmdir "$PARENT" 2>/dev/null; do
PARENT="$(dirname "$PARENT")"
done
如果 git branch -d 因“not fully merged”而失败,请停止操作并告知用户先合并。绝不使用 git branch -D。
rmdir 循环会清理分支名称包含斜杠时留下的空父目录,并在没有剩余分支时移除每个仓库对应的目录。
安全规则
- 仅进行本地合并。不要创建拉取请求。
- 移除时,如果 worktree 中有未暂存或未提交的工作,请询问用户是要合并还是强制删除。
- 绝不要手动删除 worktree 分支。只能使用
git worktree remove。 - 绝不要手动删除 worktree 目录。始终使用
git worktree remove。 - 未经用户明确许可,绝不要强制推送。
- 根据
git worktree list --porcelain确定路径。绝不要硬编码路径。