Git Worktree
简介
git worktree 允许你从同一个 Git 仓库中同时检出(checkout)多个分支到不同的目录。
通常情况下,一个 Git 仓库只能在一个目录下对应一个工作区(Working Tree)。如果你需要在不同的分支间切换(例如:正在开发功能 A,突然需要修复分支 B 的 Bug),通常需要:
git stash保存当前进度 → 切换分支 → 修复 → 切回分支 →git stash pop。- 或者重新
git clone一份仓库到新目录。
git worktree 提供了更好的解决方案:它允许你在文件系统中创建与主仓库关联的额外工作目录,每个目录对应不同的分支,互不干扰。
常用命令
1. 添加工作树 (Add)
# 创建一个新的工作树,并检出指定分支
# 语法: git worktree add <path> <branch>
git worktree add ../project-hotfix hotfix/login-bug
# 基于当前分支创建一个新分支并检出到新目录
git worktree add -b <new-branch> <path>2. 查看工作树 (List)
git worktree list输出示例:
/path/to/main-repo (HEAD detached at main)
/path/to/project-hotfix (hotfix/login-bug)3. 移除工作树 (Remove)
当工作完成后,可以直接删除文件夹,或者使用命令移除:
git worktree remove <path>4. 清理 (Prune)
如果手动删除了工作树的文件夹,Git 记录中可能还保留着信息,可以使用 prune 清理:
git worktree prune最佳实践:使用 Bare Repository 管理
一种整洁的管理方式是使用 Bare Repository 作为中心,所有工作分支都作为 worktree 存在。
-
克隆为 Bare 仓库:
git clone --bare git@github.com:user/repo.git .bare -
创建
.git文件指向 bare 仓库(可选,方便在根目录操作): 在根目录创建一个.git文件,内容为gitdir: .bare。 -
添加 Worktree:
git worktree add main git worktree add feature-a
目录结构看起来像这样:
project/
├── .bare/ # Git 核心数据
├── main/ # 主分支工作区
├── feature-a/ # 功能 A 工作区
└── hotfix/ # 修复工作区这样可以保持项目目录非常整洁,且所有工作区共享同一个 .git 仓库对象库,节省磁盘空间。