>> >> >> Reference << << << <<<<<<Ref>>>>>>
Worktree
Modified: 2025-12-31 | Author:ljf12825

Git Worktree允许在一个仓库中同时处理多个工作区(working directory),而不必克隆多个仓库
通过Worktree,可以在不同的分支上工作,且这些分支分别有自己的独立工作区,这样避免了在同一个工作区中切换分支产生的干扰
简单来说,Worktree的存在意义就是把分支映射为根目录下的文件夹,避免了分支切换带来的负面影响

基本概念

Git中worktree是一个与仓库中的数据区(repsitory data)相关联的工作目录
通常情况下,会在一个工作区中进行开发,比如你有一个主分支main,你在该分支上工作,切换到另一个分支时,Git会清理工作目录并加载目标分支的内容。这意味着你无法同时在多个分支上进行开发

而Git Worktree解决了这个问题,它允许你在一个仓库中创建多个工作区,每个工作区都可以独立地操作不同分支。例如,你可以在一个工作区上开发feature-a分支,在另一个工作区上开发feature-b分支,这两个工作区之间互不干扰

Git Worktree命令

添加工作区

git worktree add是创建新工作区的命令,使用时可以指定一个新的路径和分支名。如果指定的分支不存在,Git会自动为你创建该分支

git worktree add <path> <branch>

示例

git worktree add ../feature-branch feature-branch 

这会在当前目录的父目录下创建一个新的工作区feature-branch,并切换到该分支。此时你可以在../feature-branch目录中独立工作

移除工作区

如果你不再需要某个工作区,可以通过git worktree remove命令将其移除。移除的只是该工作区的文件,并不会影响到Git仓库的历史或分支

git worktree remove <path>

列出所有工作区

可以使用git worktree list命令来查看当前所有的工作区和他们对应的分支

git worktree list

查看工作区的状态

与普通的Git仓库相同,可以在工作区中执行git status来查看当前分支的状态,查看那些文件被修改,那些文件被暂存等
可以在多个工作区中同时进行开发,每个工作区都拥有独立的git status,不会互相干扰

工作区和仓库的关系

工作流示例

并行开发多个功能

假设你正在开发一个功能feature-1,并且在开发过程中,团队需要你处理一个急需修复的bug

# 在当前工作区上开发feature-1
# 创建一个新的工作区用于修复 bug
git worktree add ../bugfix main 

使用工作区来测试不同版本

假设你想要对比main分支和feature-1分支的变化,可以在一个工作区中检查main,在另一个工作区中检查feature-1,此时你可以同时对比两个分支的差异

# 创建一个工作区用于 main 分支
git worktree add ../main main 
# 创建另一个工作区用于 feature-1 分支
git worktree add ../feature-1 feature-1

然后可以分别在../main../feature-1目录中查看文件差异,进行对比

保持多个功能开发的独立性

如果需要同时开发多个功能或修复多个bug,并且希望它们独立地进行,你可以为每个功能/bug创建一个工作区。这可以避免在切换分支时对工作区内容造成的干扰

# 在当前工作区开发 feature-1
git worktree add ../feature-2 feature-2
git worktreee add ../bugfix bugfix 

这时,可以分别在../feature-2../bugfix工作区中进行开发,它们互不干扰

推送远端

每个工作区对应远端一个分支,根目录也会对应一个分支
每个工作区目录改动后,根目录的Git状态也会发生改变
因此,建议将根目录作为工作区管理目录,不要放其他内容\

优势与局限

优势

局限