🧭 Git Worktree 使用笔记¶
一、什么是 git worktree¶
git worktree 允许在同一个 Git
仓库中创建多个独立的工作目录(工作树),每个目录可以检出不同的分支或提交点。\
它让开发者能够在多个分支之间并行工作,而不必频繁切换分支或使用 stash。
示例:
这会在仓库外部(上级目录)新建一个名为 feature-x 的文件夹,并检出分支
feature-x。
二、典型使用场景¶
| 场景 | 传统做法 | 使用 git worktree |
|---|---|---|
| 修复 bug 时临时切分支 | stash + checkout |
新建独立工作树 |
| 同时对比多个分支 | 多次切换分支 | 多目录并行打开 |
| 查看旧版本 | git checkout vX.X.X |
独立检出到新目录 |
| 自动化构建或测试 | 多次克隆仓库 | 共享同一 .git 对象库 |
三、主要优势¶
| 优点 | 说明 |
|---|---|
| 💡 独立工作区 | 每个工作树有自己的工作目录、暂存区和 HEAD |
| 💾 节省磁盘空间 | 所有工作树共享 .git/objects |
| ⚡ 切换快速 | 无需重新检出或 stash |
| 🧱 完全兼容 Git 命令 | 可执行 commit、merge、rebase 等 |
| 🧹 清理方便 | git worktree remove 即可安全删除 |
四、git diff 与工作树的关系¶
-
各工作树独立计算 diff
在主仓库中运行:
→ 比较当前工作树与其 HEAD。
在另一工作树(如
../feature-x)中运行:→ 比较该工作树的改动。
两者互不干扰。
-
跨分支或跨工作树比较
-
比较分支:
-
比较不同目录的文件内容:
-
| 命令 | 比较对象 | 是否影响其他工作树 |
|---|---|---|
git diff |
当前工作树与其 HEAD | 否 |
git diff main feature-x |
仓库层面分支 | 否 |
git diff ../repo ../feature |
不同目录文件系统 | 否 |
五、为什么常用 ../feature¶
git worktree add 的语法为:
使用 ../feature 的原因:
-
保持仓库目录干净
- 避免在项目内部堆积多个子文件夹。\
- 清晰区分主仓库与临时分支目录。
-
避免嵌套仓库问题
- 在 Git 仓库内部再建 Git 子目录会导致路径和
.gitignore混乱。
- 在 Git 仓库内部再建 Git 子目录会导致路径和
-
方便多分支并行开发\ 多个分支目录平级存在,互不干扰:
project/ ├── .git/ ├── src/ └── README.md feature-A/ feature-B/
六、目录结构对比(文字版)¶
❌ 使用 git worktree add feature feature-x¶
目录结构如下(工作树嵌套在主仓库内部):
project/
├── .git/
├── src/
├── tests/
├── README.md
└── feature/ ← 子目录(不推荐)
├── main.py
└── ...
风险: - 容易混淆主仓库与子仓库; - IDE / 构建工具路径容易冲突。
✅ 使用 git worktree add ../feature feature-x¶
目录结构如下(平级目录,推荐):
project/
├── .git/
├── src/
└── README.md
feature/
├── main.py
└── ...
优点: - 目录清晰; - 删除简单; - 可同时打开多个分支目录开发。
七、常用维护命令¶
| 操作 | 命令 |
|---|---|
| 删除工作树 | git worktree remove ../feature |
| 清理无效引用 | git worktree prune |
| 查看所有工作树 | git worktree list |
八、注意事项¶
-
删除工作树时请使用
git worktree remove,不要手动rm -rf。 -
同时修改同一文件的多个工作树时要小心合并冲突。
-
每个工作树都有独立的暂存区和 HEAD,但共享
.git对象库。 -
若出现 "locked" 或 "prunable" 提示,用:
🏁 总结¶
| 特性 | 说明 |
|---|---|
| 工作区独立 | 各分支互不影响 |
| 对象库共享 | 节省磁盘空间 |
| 目录推荐放外层 | 避免嵌套混乱 |
| diff 逻辑独立 | 每个工作树自成一体 |
| 删除需规范操作 | git worktree remove 安全可靠 |