跳转至

🧭 Git Worktree 使用笔记

一、什么是 git worktree

git worktree 允许在同一个 Git 仓库中创建多个独立的工作目录(工作树),每个目录可以检出不同的分支或提交点。\ 它让开发者能够在多个分支之间并行工作,而不必频繁切换分支或使用 stash

示例:

git worktree add ../feature-x feature-x

这会在仓库外部(上级目录)新建一个名为 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 与工作树的关系

  1. 各工作树独立计算 diff

    在主仓库中运行:

    git diff
    

    → 比较当前工作树与其 HEAD。

    在另一工作树(如 ../feature-x)中运行:

    git diff
    

    → 比较该工作树的改动。

    两者互不干扰。

  2. 跨分支或跨工作树比较

    • 比较分支:

      git diff main feature-x
      
    • 比较不同目录的文件内容:

      git diff ../repo ../feature
      
命令 比较对象 是否影响其他工作树
git diff 当前工作树与其 HEAD
git diff main feature-x 仓库层面分支
git diff ../repo ../feature 不同目录文件系统

五、为什么常用 ../feature

git worktree add 的语法为:

git worktree add <path> [<branch>]

使用 ../feature 的原因:

  1. 保持仓库目录干净

    • 避免在项目内部堆积多个子文件夹。\
    • 清晰区分主仓库与临时分支目录。
  2. 避免嵌套仓库问题

    • 在 Git 仓库内部再建 Git 子目录会导致路径和 .gitignore 混乱。
  3. 方便多分支并行开发\ 多个分支目录平级存在,互不干扰:

    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" 提示,用:

    git worktree prune
    

🏁 总结

特性 说明
工作区独立 各分支互不影响
对象库共享 节省磁盘空间
目录推荐放外层 避免嵌套混乱
diff 逻辑独立 每个工作树自成一体
删除需规范操作 git worktree remove 安全可靠

参考资料

[1].https://git-scm.com/docs/git-worktree