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

Git 怎么用 worktree 同时检出两个功能分支

来源:17golang原创

时间:2026-09-07 09:31:00 368浏览 收藏

如果你正在开发 feature/login,又临时需要切到 feature/export 修一个问题,直接在同一个目录执行 git switch 往往会打断当前修改。更适合的办法是使用 git worktree:主工作树保留一个分支,再为另一个分支创建独立目录。两个目录共享仓库对象,但分别拥有自己的工作区、HEAD 和暂存区。

最小用法是:在主仓库的父目录执行 git worktree add ../project-export feature/export。命令成功后,两个目录就能同时检出两个分支;不要对已经被其他工作树占用的分支再次强制检出。
要点速览
  • worktree add 的第一个参数是新目录,最后一个参数是要检出的分支。
  • 每个工作树独立记录当前分支和暂存区,切换目录即可切换上下文。
  • 删除工作树优先使用 git worktree remove,手动删目录后再用 prune 清理元数据。

第1步:准备主工作树和两个分支

先进入主工作树,确认当前仓库没有未提交文件。示例把主目录命名为 demo-app,并约定两个兄弟目录分别服务登录和导出功能。父目录关系很重要:linked worktree 不要放进另一个工作树内部,否则后续移动和清理容易混乱。

# 进入主工作树,先看当前分支和未提交文件
cd ~/workspace/demo-app
git branch --show-current
git status --short

# 查看目标分支是否已经存在
git branch --list 'feature/login' 'feature/export'

git status --short 没有输出时再继续。若主工作树有未提交修改,不必为了创建 worktree 强行提交;先保存或提交这些修改,避免把当前状态误认为新目录的内容。

第2步:从现有仓库创建第二个工作树

在主仓库目录执行下面的命令,把已有的 feature/export 检出到兄弟目录。../demo-app-export 是目录路径,不是分支名;Git 会把这个 linked worktree 注册到主仓库的管理信息中。

# 为已有分支建立第二个工作目录
git worktree add ../demo-app-export feature/export

# 如果分支还不存在,用 -b 从当前提交创建并检出
# git worktree add -b feature/export ../demo-app-export

命令完成后,进入新目录执行 git branch --show-current,应看到 feature/export。如果提示分支已被其他工作树检出,先用 git worktree list 找到占用它的目录;不要直接加 --force 覆盖隔离保护。

Git 工作树管理界面显示新建工作树的目录路径和目标分支字段
图1:新建工作树时同时确认目录路径与目标分支,创建后再进入新目录核对当前分支。

第3步:在两个目录分别开发

现在可以把主目录留给登录功能,把新目录交给导出功能。它们共享对象库和提交历史,因此拉取、提交不会复制一整份仓库;但每个工作树都有自己的检出状态和暂存区,未提交文件也不会在两个目录之间串来串去。

# 主工作树:开发登录功能
cd ~/workspace/demo-app
git switch feature/login
git branch --show-current

# 第二工作树:开发导出功能
cd ~/workspace/demo-app-export
git branch --show-current
git status --short

如果主工作树原本就已经在 feature/login,不要再次执行切换。更稳妥的核对方式是分别查看两个目录的分支名和状态,而不是只看编辑器当前打开的文件夹。

第4步:用 worktree list 核对隔离结果

在任意一个工作树运行列表命令,Git 会列出主工作树和 linked worktree。普通输出适合快速查看;排查脚本或路径问题时使用 porcelain 格式更稳定。

# 快速查看每个工作树的路径、提交和分支
git worktree list

# 给脚本或排错使用稳定的字段格式
git worktree list --porcelain
检查项期望结果异常处理
路径主目录和新目录是两个兄弟目录路径重复或指向旧目录时先停止操作
分支feature/loginfeature/export 各出现一次不要用强制参数掩盖重复检出
状态需要删除的树没有未提交修改先提交、暂存或明确备份修改
Git 工作树列表界面同时显示主工作树和两个功能分支及干净状态
图2:列表结果把路径、当前分支和清理入口放在一起,适合在并行开发前做一次隔离核对。

第5步:提交后安全移除不再需要的工作树

功能分支已经合并或任务结束后,先进入准备删除的目录检查状态,再从其他工作树执行移除。remove 默认会拒绝删除不干净的工作树,这是保护未提交文件的最后一道提醒。

# 先在待删除目录确认没有未提交修改
cd ~/workspace/demo-app-export
git status --short

# 回到主工作树,移除已经确认不用的 linked worktree
cd ~/workspace/demo-app
git worktree remove ../demo-app-export

# 如果目录曾被手动删除,清理残留的工作树登记信息
git worktree prune

只有在确认内容可以丢弃时才考虑 git worktree remove --force。若工作树放在移动磁盘或网络位置,可以使用 git worktree lock --reason "外置磁盘暂离" ../demo-app-export 防止 Git 把暂时不可见的登记清理掉;重新接入后再执行 unlock

常见问题

一个分支能同时被两个 worktree 检出吗?

默认不能。Git 会拒绝把同一分支再次分配给另一个工作树,因为两个目录会同时修改同一条分支引用。应为并行任务建立不同分支,或使用 detached worktree 做一次性实验。

删除工作树会删除分支吗?

不会。git worktree remove 删除的是 linked worktree 目录和对应登记;分支仍然保留,后续可以重新用 worktree add 检出。

为什么手动删除目录后列表里还显示它?

因为主仓库还保留着工作树的管理记录。确认目录确实不再需要后,在任一工作树执行 git worktree prune,再用 git worktree list 复查。

按这个顺序操作,主工作树和第二工作树就能长期并行存在:先用目录隔离分支,再用列表核对归属,最后只删除已经确认干净的工作树。

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