Skip to content

Git worktree

概念

在日常开发中,我们如果需要切换分支开发的话,就会先提交当前分支的代码或者暂存起来,然后切换到目标分支进行开发。Git worktree允许你同时检出多个分支,每个分支在不同的文件夹,但它们共享同一个.git目录,从而便于管理多个分支的代码。

常用场景

  • AI 驱动开发:在独立工作树中运行 AI 代理,以防止其覆盖本地未保存的更改。
  • 紧急漏洞修复:在独立目录中处理关键问题,不会打断当前的进度。
  • 并行代码审查:在本地检出和测试拉取及合并请求,而不影响现有环境、数据库状态或构建产物。
  • 长时间运行的任务:在一个工作树中执行大量测试套件或复杂构建,同时在另一个工作树中继续编写代码。
  • 多分支环境切换:无需储藏更改,或者等待切换分支后大量文件的重新索引,即可管理多个长期分支。

场景举例:我正在开发一个功能,此时有紧急缺陷需要修复

alt text

此时我们需要从main分支切一个hotfix分支出来修复缺陷。

操作步骤

bash
git worktree add ../worktree-practice-hotfix -b hotfix/main main

命令解释:

  • ../worktree-practice-hotfix:新工作树的路径,会放在当前仓库目录的同级目录下(当然你也可以指定其他绝对路径)。
  • -b hotfix/main:在新工作树中创建并切换到名为 hotfix/main 的新分支。
  • main:新分支的起点(基于 main 分支的当前提交)。

执行之后,会在 ../worktree-practice-hotfix 目录下创建一个新的工作树,该工作树共享当前仓库的 .git 目录,但是有自己独立的目录结构和文件。hotfix/main 分支的代码会检检出到 ../worktree-practice-hotfix 目录下。

alt text

我们可以看到,这个“工作副本”是一个物理上独立的文件夹,内容和当前仓库的代码是独立的,互不干扰。 alt text

我们注意到里面有一个.git文件:

.git文件内容

text
gitdir: /Users/zhuweicong/github_project/workstree-practice/.git/worktrees/worktree-practice-hotfix

与主仓库.git(是一个目录)不同,该.git文件是描述了其关联的主仓库的绝对路径。

重点来了:此时,我们可以在../worktree-practice-hotfix目录下进行开发(例如:修复缺陷),而不会影响到仓库的其他分支。

Git clone VS Git worktree

维度git clonegit worktree
工作方式每次 clone 一个全新的完整仓库副本(含 .git 目录和历史)共享同一个主仓库的 .git 和历史,仅为每个分支创建一个独立的工作目录
磁盘占用每个 clone 都是完整副本,多次 clone 占用 N × 仓库大小主仓库一份,每个 worktree 仅占用工作区文件大小(不含 .git 历史),大幅节省空间
创建速度慢,需要拉取全部历史、对象和文件快,只需创建工作区文件即可,几乎瞬间完成
分支共享各 clone 之间互不相干,无法直接感知彼此分支同一仓库的所有 worktree 共享引用、stash、config,git branch 能看到所有分支
同时操作多分支需要打开多个终端/IDE,频繁 cd 切换每个 worktree 一个目录,可同时在不同目录中开发不同分支,无需来回切换
网络依赖需要网络拉取(除非已有本地 bare repo)纯本地操作,无需网络
同步与一致性需要手动 git remote 管理,每个 clone 独立 fetch/push所有 worktree 共用 .git,fetch/push 一次生效所有 worktree
依赖管理风险各自 node_modules 独立,互不影响各 worktree 的 node_modules 也需各自安装,但共享同一 .gitignore
删除/清理直接 rm -rf 整个目录即可使用 git worktree remove 清理,会自动清理元数据
学习成本低,git 基础操作中,需要理解 worktree 的概念和命令

场景选择建议

场景推荐方案原因
CI/CD 流水线构建git clone隔离环境,每次构建干净独立,避免交叉污染
本地同时开发多个功能分支git worktree无需切换分支,同一时间在多个目录分别开发 feature/bugfix
紧急修复线上 bug(开发中切出去)git worktree不打断当前的开发分支,快速创建 worktree 修复并提交
临时查看/对比其他分支的代码git worktree秒级创建,用完即删,不影响主工作区
代码审查(Code Review)git worktree将 PR 分支拉到独立目录查看,不影响当前开发分支
不同机器/环境之间搬运代码git cloneworktree 依赖同一个主仓库,不适合跨机使用
新手学习 gitgit clone心智模型简单,社区资料丰富
磁盘空间紧张git worktree大量节省存储空间
长期维护多版本(如 v1 / v2)git clone版本差异大时隔离更安全,避免 worktree 路径依赖问题