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 Stash | Git Clone (副本) | Git Worktree |
|---|---|---|---|
| 上下文切换 | 必须中断当前工作,保存状态 | 需要重新下载代码,耗时耗空间 | 秒级切换,互不干扰 |
| 磁盘占用 | 极小 | 极大(重复的 .git 文件夹) | 极小(共享 .git 目录) |
| 分支同步 | 只能在一个地方看一个分支 | 副本间不互通,需要 | fetch 实时同步(共享本地 Ref) |
| 适用场景 | 几分钟的小任务 | 隔离环境,长期独立运行 | 并行开发、快速热修复、代码对比 |
实战场景演示
- 紧急热修复(Hotfix) 痛点:当前分支改动了 50 个文件,还没法 Commit。 操作:
- 在主项目目录外创建一个新的工作区:
git worktree add ../hotfix-branch master - 进入
../hotfix-branch目录,修完 Bug,直接提交并推送到远端。 - 删掉该目录,回到原目录继续写你的
Feature-A。你的开发思路完全没被打断。
- 在主项目目录外创建一个新的工作区:
- 代码 Review 与 对比 痛点:Review 同事代码时,想在本地跑一下看看效果,但又不想动自己的代码。 操作: 给同事的分支开一个独立的 Worktree,一边看他的代码,一边运行他的程序,而你的编辑器依然保留着你之前的调试断点。
- 长耗时编译与测试 痛点:大型项目编译一次要 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>避坑小贴士
- 禁止“一妻多夫”:Git 不允许两个工作区同时处于同一个分支。如果你想在两个地方操作同一个逻辑,建议给第二个工作区新建一个临时分支(例如 feature-debug)。
- 路径建议:建议将 Worktree 目录放在主仓库的上一级(如 ../),这样可以避免 Worktree 目录被主仓库的 Git 误认为是未追踪的文件,也方便清理。
- 配置文件:虽然 .git 目录共享,但每个 Worktree 的 index(暂存区)和 HEAD 是独立的,请放心使用。
结语
Git Worktree 改变了我们处理任务优先级的方式。它让我们从“线性工作流”进化到了“并发工作流”。 建议: 下次当你想输入 git stash 的时候,停顿一秒,试着输入一次 git worktree add。相信我,你会爱上这种从容不迫的开发体验。