登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  软件教程

Git worktree怎样为多个分支创建并行工作目录

来源:17golang原创

时间:2026-11-04 12:24:40 463浏览 收藏

如果你需要同时处理多个分支,直接在同一个目录里反复切换分支,容易把未提交修改带到错误的任务上。Git worktree 的做法是让一个仓库挂出多个工作目录:主工作树继续保留当前分支,其他目录分别关联到 feature/search、fix/login 等分支。

先说结论:进入仓库根目录执行 git worktree add 目标目录 分支名,创建后用 git worktree list 核对路径和分支;任务结束时用 git worktree remove 回收目录,手工删除过目录则用 git worktree prune 清理记录。

官方地址:https://git-scm.com/docs/git-worktree

一、先划分主目录和并行目录

假设仓库目录是 demo-app,它当前是主工作树。建议把并行目录放在仓库旁边,而不是放在 demo-app 内部。这样目录关系清楚,也不会把一个工作树误放进另一个工作树的文件范围。

可以先规划成下面这样:

  • demo-app:继续保留主分支或当前稳定分支。
  • demo-app-search:专门处理 feature/search。
  • demo-app-login:专门处理 fix/login。

真正执行前,要确认目标目录不存在,且目标分支没有已经被另一个工作树占用。Git 会把这些工作树的管理信息放在仓库内部,但每个工作树拥有独立的 HEAD 和索引。

二、用 git worktree add 创建已有分支的目录

在主仓库目录执行下面的命令。第一条把已有的 feature/search 分支签出到旁边的新目录,第二条对 fix/login 做同样的操作。

cd /path/to/demo-app
# 中文说明:为已有分支创建两个相邻的独立工作目录
git worktree add ../demo-app-search feature/search
git worktree add ../demo-app-login fix/login
# 中文说明:列出仓库当前登记的所有工作树,供后面核对
git worktree list

如果分支还不存在,可以在创建工作树时用 -b 创建新分支:

# 中文说明:从当前提交创建新分支,并把它直接放入新的工作目录
git worktree add -b feature/report ../demo-app-report
# 中文说明:进入新工作目录后,后续提交会落在 feature/report 上
cd ../demo-app-report

命令成功的判断不是“目录出现了”这么简单,还要确认目录中的分支与任务一致。不要在同一个工作树中再次执行普通 git switch 来代替 worktree,这会破坏并行目录的用途。

Git worktree 主工作树与多个分支工作目录的关系说明图
图1:Git worktree 创建多个并行目录的操作示意图,不是实际终端截图。

三、分别进入目录开展不同分支的工作

创建完成后,每个目录都可以作为独立的开发入口。你可以在一个终端进入 demo-app-search 修改搜索功能,在另一个终端进入 demo-app-login 修复登录问题。两个目录共享对象数据库和提交历史,但不会共享各自未提交的工作区文件。

# 中文说明:在搜索分支目录中确认当前分支,避免把修改写到主目录
cd ../demo-app-search
git branch --show-current
git status --short
# 中文说明:切换到登录分支目录时也单独确认一次
cd ../demo-app-login
git branch --show-current
git status --short

如果 git branch --show-current 显示的不是预期分支,先停止编辑,回到主仓库执行 git worktree list 检查绑定关系。并行工作目录的核心价值是减少切换,因此每个目录都要有清晰的命名。

四、用 git worktree list 核对路径和分支

git worktree list 会列出主工作树和 linked worktree。重点核对目录路径、当前提交以及分支名。若某个工作树已被锁定或路径缺失,列表还可能显示相应状态。

# 中文说明:使用 porcelain 格式,便于逐项核对 path、HEAD 和 branch 字段
git worktree list --porcelain
# 中文说明:查看更适合人工阅读的简洁列表
git worktree list

建议把结果核对分成三步:第一,路径数量是否等于规划的工作树数量;第二,demo-app-search 是否对应 feature/search,demo-app-login 是否对应 fix/login;第三,进入每个目录运行 git status --short,确认未提交修改只出现在对应任务目录。

Git worktree list 路径分支和清理状态核对说明图
图2:Git worktree 关联关系与清理状态的结果示意图,不是实际运行截图。

五、任务结束后安全移除工作树

分支合并或任务取消后,先确认目录中的修改已经提交、转移或明确放弃,再移除工作树。默认情况下,Git 只允许移除干净的工作树;这能避免误删未提交文件。

# 中文说明:先查看目标工作树是否还有未提交内容
cd ../demo-app-search
git status --short
# 中文说明:回到主工作树后,移除已经完成的并行目录
cd ../demo-app
git worktree remove ../demo-app-search
# 中文说明:再次列出工作树,确认登记信息已经减少
git worktree list

如果确实要删除仍有修改的工作树,Git 提供 git worktree remove --force,但它会绕过干净状态保护。生产仓库或多人协作目录不建议把 --force 当成默认清理方式。

六、处理锁定、手工删除和路径搬迁

临时磁盘、网络盘或不希望被自动清理的工作树可以锁定,并用原因文字记录用途:

# 中文说明:锁定可移动或暂时离线的工作树,避免管理信息被自动清理
git worktree lock ../demo-app-login --reason "等待登录问题复现"
# 中文说明:工作树重新可用后解除锁定
git worktree unlock ../demo-app-login
# 中文说明:如果目录被手工删除,用 prune 清理仓库中的过期登记
git worktree prune
# 中文说明:如果目录被移动但仍要保留关联,用 repair 重新建立连接
git worktree repair ../demo-app-login

这里要区分三个动作:remove 是由 Git 管理的正常移除,prune 是清理已经缺失工作目录留下的管理记录,repair 则用于工作树或主仓库路径发生外部移动后的重新关联。不要用 prune 代替正常的 remove。

常见问题

一个分支为什么不能同时被两个 worktree 使用?

Git 默认会阻止同一分支同时被多个工作树签出,这是为了避免两个目录同时推进同一个分支产生混乱。需要并行处理时,应为不同任务建立不同分支。

删除目录后为什么 list 里还有记录?

直接删除目录没有经过 Git 的正常移除流程,仓库中可能还留有 linked worktree 的管理信息。回到主工作树执行 git worktree prune,再用 git worktree list 查看登记是否清理。

worktree 会不会复制一份完整仓库?

它会创建新的工作目录和必要的每个工作树元数据,同时共享仓库对象和提交历史;因此通常比完整复制仓库更适合短期并行任务,但每个工作目录仍要单独安装依赖和保存未提交修改。

总结

这套流程可以记成“规划目录、add 创建、进入后确认分支、list 验收、remove 回收”。遇到工作树离线、被手工删除或路径搬迁,再分别使用 lock、prune 和 repair。只要每个目录绑定一个明确分支,就能在同一个 Git 仓库中稳定地并行处理多个任务。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>