Git 怎么用 worktree 同时检出两个功能分支
如果你正在开发 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 覆盖隔离保护。

第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/login 与 feature/export 各出现一次 | 不要用强制参数掩盖重复检出 |
| 状态 | 需要删除的树没有未提交修改 | 先提交、暂存或明确备份修改 |

第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 复查。
按这个顺序操作,主工作树和第二工作树就能长期并行存在:先用目录隔离分支,再用列表核对归属,最后只删除已经确认干净的工作树。
Go omitempty 为什么没有忽略结构体零值
- 上一篇
- Go omitempty 为什么没有忽略结构体零值
- 下一篇
- Hugging Face Transformers 怎么用动态 padding 减少推理浪费
-
- 文章 · 软件教程 | 2小时前 | vs code · 软件教程 · 搜索性能 · 工作区设置 · VS Code 全文搜索 大文件夹 search.exclude files.watcherExclude
- VS Code 大文件搜索变慢时怎么设置排除目录
- 115浏览 收藏
-
- 文章 · 软件教程 | 3小时前 | vs code · 软件教程 · 任务编排 · 构建排错 · tasks.json VS Code Tasks dependsOn dependsOrder 构建任务 失败传播
- VS Code Tasks 怎么让构建任务失败时停止后续任务
- 256浏览 收藏
-
- 文章 · 软件教程 | 9小时前 | 环境变量 · vs code · 软件教程 · Remote SSH · 远程开发 · VS Code path Remote SSH 远程终端 扩展宿主 shell环境
- VS Code Remote SSH 连接后终端环境不一致怎么排查
- 115浏览 收藏
-
- 文章 · 软件教程 | 10小时前 | vs code · launch.json · 调试环境变量 ·
- VS Code 怎么为不同项目设置不同的调试环境变量
- 215浏览 收藏
-
- 文章 · 软件教程 | 23小时前 | Docker Desktop · Docker volume · 容器数据 · volumes 数据卷 Docker Desktop Stored data
- Docker Desktop 怎么查看容器数据卷里的文件
- 464浏览 收藏
-
- 文章 · 软件教程 | 1天前 | git · GitHub Desktop · 分支管理 · GitHub Desktop stash 切换分支 未提交修改
- GitHub Desktop 切换分支前怎么暂存未提交修改
- 212浏览 收藏
-
- 文章 · 软件教程 | 1天前 | 提交 · git · GitHub Desktop · GitHub Desktop 部分提交 选择代码行
- GitHub Desktop 怎么只提交文件中的部分修改
- 142浏览 收藏
-
- 文章 · 软件教程 | 1天前 | datagrip · 数据库工具 · 数据导出 · INSERT语句 查询结果导出 DataGrip SQL Inserts
- DataGrip 怎么把查询结果导出成 INSERT 语句
- 106浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 171次使用
-
- C-Eval
- 深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
- 102次使用
-
- AI Prompt Library
- 探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
- 21次使用
-
- LangGPT
- LangGPT是一种受编程语言启发的结构化提示词设计工具,提供双层框架、模块化模板及变量功能,帮助用户高效编写高质量Prompt。该项目已在GitHub免费开源,适用于内容创作、编程辅助等多场景。
- 32次使用
-
- ClickPrompt
- ClickPrompt是一款专为AI提示词编写者设计的开源在线工具,支持Stable Diffusion绘图、ChatGPT对话及GitHub Copilot代码辅助。提供Prompt自动生成、一键运行、社区分享及可视化优化功能,帮助用户高效获取精准AI输出。
- 71次使用
-
- SSH 连接 Git 报 Permission denied (publickey) 怎么办?一套排查清单
- 2026-06-17 146浏览
-
- Go 1.27 go doc 支持 package@version:查指定版本 API 时如何避免看错文档
- 2026-08-31 474浏览
-
- Go 编译时怎么写入版本号和 Git 提交信息
- 2026-09-06 358浏览
-
- 数据库迁移状况百出?快来看看这个开源工具
- 2023-02-16 164浏览
-
- 关于前后端分离及初始化配置
- 2023-01-26 109浏览

