git worktree 是唯一能解决本地多分支并行开发上下文丢失、状态污染、路径混淆问题的原生方案,它通过共享.git但隔离工作目录、HEAD和index实现真正多分支同时开发。

Git 本地多分支管理真正的效率瓶颈不在“能不能切”,而在“切完之后怎么不丢上下文、不污染状态、不记错路径”。原生 git worktree 是唯一能解这个问题的方案,其他插件或 GUI 工具(如 Sublime Text 的 Git 插件)只是封装了 git checkout,本质仍是单工作目录切换,无法并行。
git worktree add 创建时路径和分支名必须显式指定
很多人误以为 git worktree add 会自动推导分支名或默认用当前分支,其实它要求两个参数都明确给出:path 和 branch。省略 branch 会导致创建一个分离 HEAD 的工作树;省略 path 则直接报错。
- 正确写法:
git worktree add ../hotfix-123 hotfix/123 - 错误写法:
git worktree add ../hotfix-123(没指定分支,HEAD 分离) - 想基于当前分支新建工作树?得先
git checkout -b new-feature,再git worktree add ../new-feature new-feature - 路径不能是已有 Git 仓库——
git worktree会拒绝在含.git的目录下创建
git worktree list 输出不可靠,别直接 parse
git worktree list 的输出是面向人看的纯文本,列之间用空格分隔,但路径里可能含空格,分支名也可能含空格(虽然不推荐),导致 shell 脚本解析极易出错。它也不区分主工作树和附加工作树,更不报告是否 locked 或 prunable。
GitHub 仓库备份技能 - 将 OpenClaw 工作空间自动或手动备份至 GitHub 私有仓库。支持自动定时备份和手动交互式配置,引导完成 Token 配置、仓库创建、首次备份及定时任务设置。用途:(1) 首次设置 (2) 日常备份。
- 不要用
awk '{print $1}'提取路径——遇到/Users/me/My Project就崩 - 真正安全的方式是用
git worktree list --porcelain(Git 2.28+),输出格式稳定,每行以worktree、HEAD、branch开头,可被脚本可靠消费 - 主工作树永远排第一,但
--porcelain不标记它,需比对路径是否等于$(git rev-parse --git-common-dir | sed 's|/objects$||')
git worktree remove 失败常见于未提交或未 push 的修改
git worktree remove 默认拒绝删除含未提交变更或未推送提交的工作树,这是保护机制,不是 bug。但它不会告诉你具体哪条 commit 没 push,只报 error: working tree '<path>' is not clean</path>。
- 先进到该目录:
cd ../bugfix-456 - 运行
git status看是否有 uncommitted changes - 运行
git log origin/main..HEAD(假设你跟踪origin/main)确认是否有未推送提交 - 若确定可丢弃,加
-f:git worktree remove -f ../bugfix-456 - 注意:
-f不会删.git/worktrees/xxx下的元数据,后续需手动git worktree prune
Sublime Text 的 Git 插件根本不支持 worktree 切换
wbond 的官方 Git 插件只监听项目根目录的 .git,所有命令(包括 Git: Checkout Branch)都作用于主工作树。它完全不知道你有其他 worktree,也不会在状态栏显示当前 worktree 对应的分支。
- 你在
../feature-x目录里用 Sublime 打开文件,插件仍认为你在主工作树里操作 -
Git: Checkout Branch运行的是git checkout,不是git -C ../feature-x checkout - 真正支持 worktree 的编辑器只有 VSCode(通过工作区文件夹识别)、JetBrains 全家桶(自动检测 .git/worktrees/)
- 如果硬要用 Sublime,只能把每个 worktree 当作独立项目打开,但插件不会跨项目同步 fetch/pull 状态
worktree 的核心约束始终是:所有工作树共享同一个 .git 目录,但各自拥有独立的 index、HEAD 和工作文件。这意味着任何影响全局状态的操作(如 git fetch、git gc)在一个 worktree 执行,其他 worktree 都立刻可见;但所有本地配置(如 core.excludesFile)和钩子也必须统一管理,没法 per-worktree 设置。

















