Skip to content
Published at:

Git WorkTree 高效并行开发

在日常开发中,你是否遇到过这样的场景:

  • 正满头大汗地写着 Feature-A 的重构代码,老板突然说线上有个 Bug 要立刻修?

  • 为了对比两个分支的代码,你不得不打开两个不同的 IDE 窗口,甚至手动 clone 了两次代码库?

  • 每次切换分支都要 git stash 暂存半成品,等切回来时,甚至忘了当时存了什么?

    如果你的回答是“Yes”,那么 Git Worktree 就是你需要掌握的“真香”神技。

什么是 Git Worktree?

在默认情况下,一个 Git 仓库只有一个工作区(Working Tree)。当你执行 git checkout 时,Git 会直接修改你当前目录下的物理文件。 Git Worktree 允许你在同一个仓库中同时拥有多个工作区。 简单理解:它能让你在不同的文件夹里,同时检出(Check out)同一个仓库的不同分支。它们共享同一个 .git 目录和提交历史,但物理路径是完全隔离的。

核心优势:为什么不用传统的 Stash 或 Clone?

维度Git StashGit Clone (副本)Git Worktree
上下文切换必须中断当前工作,保存状态需要重新下载代码,耗时耗空间秒级切换,互不干扰
磁盘占用极小极大(重复的 .git 文件夹)极小(共享 .git 目录)
分支同步只能在一个地方看一个分支副本间不互通,需要fetch 实时同步(共享本地 Ref)
适用场景几分钟的小任务隔离环境,长期独立运行并行开发、快速热修复、代码对比

实战场景演示

  1. 紧急热修复(Hotfix) 痛点:当前分支改动了 50 个文件,还没法 Commit。 操作:
    1. 在主项目目录外创建一个新的工作区: git worktree add ../hotfix-branch master
    2. 进入 ../hotfix-branch 目录,修完 Bug,直接提交并推送到远端。
    3. 删掉该目录,回到原目录继续写你的 Feature-A。你的开发思路完全没被打断。
  2. 代码 Review 与 对比 痛点:Review 同事代码时,想在本地跑一下看看效果,但又不想动自己的代码。 操作: 给同事的分支开一个独立的 Worktree,一边看他的代码,一边运行他的程序,而你的编辑器依然保留着你之前的调试断点。
  3. 长耗时编译与测试 痛点:大型项目编译一次要 10 分钟。 操作: 在 Worktree-A 里运行编译脚本,直接切换到 Worktree-B 继续写代码。两个任务物理隔离,互不打架。

常用命令备忘录

bash
# 基于已有分支或commit来checkout
# 语法:git worktree add  <path> [<commit-ish>]
git worktree add ../${project_name}_${branch} ${branch}

# 基于已有分支或commit来创建新分支
# 语法:git worktree add [(-b | -B) <new-branch>] <path> [<commit-ish>]
git worktree add -b ${new_branch} ../${project_name}_${branch} ${branch}

# 查看列表
git worktree list

# worktree目录移动
git worktree move ${worktree_path} ${new-path}

# worktree 移除(有更改加-f)
git worktree remove [-f] ${worktree_path}

# worktree prune: 手动删除了worktree,清理无效记录
git worktree prune

# 其它
# git worktree repair [<path>...]
# git worktree lock [--reason <string>] <worktree>
# git worktree unlock <worktree>

避坑小贴士

  1. 禁止“一妻多夫”:Git 不允许两个工作区同时处于同一个分支。如果你想在两个地方操作同一个逻辑,建议给第二个工作区新建一个临时分支(例如 feature-debug)。
  2. 路径建议:建议将 Worktree 目录放在主仓库的上一级(如 ../),这样可以避免 Worktree 目录被主仓库的 Git 误认为是未追踪的文件,也方便清理。
  3. 配置文件:虽然 .git 目录共享,但每个 Worktree 的 index(暂存区)和 HEAD 是独立的,请放心使用。

结语

Git Worktree 改变了我们处理任务优先级的方式。它让我们从“线性工作流”进化到了“并发工作流”。 建议: 下次当你想输入 git stash 的时候,停顿一秒,试着输入一次 git worktree add。相信我,你会爱上这种从容不迫的开发体验。

Updated at: