git worktree 可以让同一个仓库同时拥有多个工作目录。主目录继续保留当前开发分支,另一个目录专门处理修复或验证任务,省去反复暂存和切换。
环境:Git 2.39+;Linux 或 macOS;Bash。下面只操作新建的临时仓库。
root=$(mktemp -d)
repo="$root/demo"
git init -b main "$repo"
git -C "$repo" config user.name "Worktree Demo"
git -C "$repo" config user.email "demo@example.invalid"
printf 'version=1\n' >"$repo/app.conf"
git -C "$repo" add app.conf
git -C "$repo" commit -m 'initial version'
# 主工作目录停留在 feature,并保存一项未合并开发。
git -C "$repo" switch -c feature
printf 'feature=true\n' >>"$repo/app.conf"
git -C "$repo" commit -am 'develop feature'
# 从 main 新建 hotfix 分支,并把它检出到第二个目录。
git -C "$repo" worktree add -b hotfix "$root/hotfix" main
printf 'patched=true\n' >>"$root/hotfix/app.conf"
git -C "$root/hotfix" commit -am 'apply hotfix'
printf 'primary: %s\n' "$(git -C "$repo" branch --show-current)"
printf 'secondary: %s\n' "$(git -C "$root/hotfix" branch --show-current)"
git -C "$repo" worktree list
输出会显示主目录仍在 feature,第二个目录位于 hotfix。两个工作目录共享对象库和提交历史,但各自拥有独立的工作区、暂存区与当前分支。
修复完成后可以合并并清理:
git -C "$repo" switch main
git -C "$repo" merge --ff-only hotfix
git -C "$repo" worktree remove "$root/hotfix"
git -C "$repo" branch -d hotfix
rm -rf -- "$root"
同一分支默认不能同时检出到两个 worktree,因此并行任务应使用独立分支。清理时优先执行 git worktree remove,让 Git 同步移除管理记录;如果工作目录被外部意外删除,可用 git worktree prune 清理失效记录。