Git Worktree实用指南:同时开发两个分支,不再反复切换
前言
开发新功能时突然收到线上问题,需要马上切换到修复分支。此时当前目录可能还有未提交修改,直接切换分支既麻烦又容易带错文件。
git worktree允许同一个Git仓库同时拥有多个工作目录。每个目录可以检出不同分支,但它们共享底层仓库对象,因此不需要重复克隆完整项目。
一、查看现有工作树
在仓库中执行:
bash
git worktree list
输出可能类似:
text
D:/projects/shop a1b2c3d [main]
这表示当前主工作目录位于D:/projects/shop,检出的是main分支。
二、为已有分支创建工作目录
假设仓库中已经存在hotfix/login分支,可以创建一个独立目录:
bash
git worktree add ../shop-hotfix hotfix/login
创建完成后的结构大致如下:
text
projects/
├── shop/ # 原目录,继续开发当前功能
└── shop-hotfix/ # 新目录,处理登录修复
两个目录可以分别打开编辑器、安装依赖和运行测试,互不覆盖工作区文件。
三、创建新分支并建立工作树
如果修复分支尚不存在,可以使用-b创建:
bash
git worktree add -b hotfix/payment ../shop-payment main
这条命令会基于main创建hotfix/payment分支,并在../shop-payment目录中检出。
执行前应先确认基准分支是否正确,避免从错误的提交开始开发。
四、为什么同一分支不能同时检出?
Git通常不允许同一个本地分支同时被两个工作树检出。原因是两个目录如果同时修改并提交到同一分支,分支指针和工作区状态容易产生冲突。
如果只是需要查看某个提交,可以创建分离头指针工作树:
bash
git worktree add --detach ../shop-review HEAD
这种目录适合代码查看和临时测试。如果要保留修改,应在其中创建新分支后再提交。
五、移除不再使用的工作树
修复完成并确认目录中没有需要保留的修改后,可以执行:
bash
git worktree remove ../shop-hotfix
这是会删除对应工作目录的操作,执行前应先进入该目录检查状态:
bash
git status
如果用户手动删除了工作树目录,Git中可能仍保留无效记录。可以先查看,再清理:
bash
git worktree list
git worktree prune --dry-run
git worktree prune
--dry-run只显示计划清理的内容,适合在正式执行前确认范围。
六、工作树与依赖目录
不同工作树拥有独立的普通文件,因此node_modules、Python虚拟环境和构建输出通常也要分别生成。
这会占用额外磁盘空间,但可以避免不同分支依赖版本互相污染。不要随意让多个工作树共享可写构建目录,否则可能出现难以定位的缓存问题。
七、一个常见的并行工作流程
假设主目录正在开发功能:
text
shop/ -> feature/cart
线上出现问题后,可以执行:
bash
git fetch origin
git worktree add -b hotfix/login ../shop-hotfix origin/main
然后在新目录中完成以下操作:
bash
cd ../shop-hotfix
git status
# 修改代码并运行测试
git add <明确的文件>
git commit -m "fix: handle expired login session"
修复任务完成后,原目录中的功能开发状态仍保持不变,不需要暂存未完成代码,也不用来回切换分支。
八、使用时的注意事项
- 创建工作树前确认目标路径不存在或为空;
- 每个工作树使用独立分支;
- 删除前检查未提交和未跟踪文件;
- 不要把工作树建立在主仓库内部;
- 大型项目需要考虑依赖和构建产物占用空间;
- 定期通过
git worktree list检查遗留目录。
总结
git worktree适合紧急修复、并行功能开发、代码审查和多版本测试。它的价值不是替代分支,而是让不同分支拥有独立工作目录,从而减少暂存、切换和恢复现场的成本。
推荐标签: Git、版本控制、开发工具、Git Worktree