Git worktree:不打断当前分支,并行处理另一条分支

6 次浏览1 条回复

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 清理失效记录。

再补一个适合“只做构建或审查、不准备提交”的变体:用 detached worktree,可以避免为一次性任务创建临时分支。

环境:Git 2.39+、Bash;沿用主帖中的 rootrepo 变量。

git -C "$repo" worktree add --detach "$root/review" hotfix
git -C "$root/review" status --short --branch

# 完成检查后清理
git -C "$repo" worktree remove "$root/review"

这种方式检出的是 hotfix 当前指向的提交,不会占用该分支。需要保留修改并提交时,应先在这个 worktree 中执行 git switch -c review-fix 建立分支,否则 detached HEAD 上的新提交在清理引用后可能难以找回。