Git Worktree实用指南:同时开发两个分支,不再反复切换

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

相关推荐
xxwl5858 小时前
Git常用命令的学习
git·学习
攻城狮-申8 小时前
git本地分支对齐远程分支
前端·git
不怕犯错,就怕不做18 小时前
git prune 自动删除本地记录中那些远程已经不存在的分支引用
linux·服务器·git
ELI_He9991 天前
如何还原已经推送的提交
git
️学习的小王1 天前
Git项目提交忽略文件怎么做?以Python项目为例,详解.gitignore
git·python·elasticsearch
lskaixin1 天前
Git命令
git
_道隐_1 天前
git 如何把一个已经commit到本地分支的,被错误staged的文件,单独拿出来revert呢?
git
lingran__1 天前
Git 完全指南(一):本地仓库基础操作
linux·git·开发工具·devops·版本控制
星空1 天前
git使用
git