当前位置:首页 > 文章列表 > 文章 > 软件教程 > Git 怎么用 worktree 同时检出两个功能分支

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

来源:17golang原创 2026-09-07 09:31:00 0浏览 收藏

如果你正在开发 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删除
Go omitempty 为什么没有忽略结构体零值Go omitempty 为什么没有忽略结构体零值
上一篇
Go omitempty 为什么没有忽略结构体零值
Hugging Face Transformers 怎么用动态 padding 减少推理浪费
下一篇
Hugging Face Transformers 怎么用动态 padding 减少推理浪费
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    171次使用
  • C-Eval中文评测基准:大语言模型多学科能力评估指南
    C-Eval
    深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
    102次使用
  • AI Prompt Library:免费AI提示词库,助力ChatGPT高效创作与营销
    AI Prompt Library
    探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
    21次使用
  • LangGPT提示词框架:结构化Prompt设计方法与开源工具指南
    LangGPT
    LangGPT是一种受编程语言启发的结构化提示词设计工具,提供双层框架、模块化模板及变量功能,帮助用户高效编写高质量Prompt。该项目已在GitHub免费开源,适用于内容创作、编程辅助等多场景。
    32次使用
  • ClickPrompt:AI提示词生成与优化工具,支持Stable Diffusion、ChatGPT及代码辅助
    ClickPrompt
    ClickPrompt是一款专为AI提示词编写者设计的开源在线工具,支持Stable Diffusion绘图、ChatGPT对话及GitHub Copilot代码辅助。提供Prompt自动生成、一键运行、社区分享及可视化优化功能,帮助用户高效获取精准AI输出。
    71次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码