Git Worktree

简介

git worktree 允许你从同一个 Git 仓库中同时检出(checkout)多个分支到不同的目录。

通常情况下,一个 Git 仓库只能在一个目录下对应一个工作区(Working Tree)。如果你需要在不同的分支间切换(例如:正在开发功能 A,突然需要修复分支 B 的 Bug),通常需要:

  1. git stash 保存当前进度 切换分支 修复 切回分支 git stash pop
  2. 或者重新 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 存在。

  1. 克隆为 Bare 仓库

    git clone --bare git@github.com:user/repo.git .bare
  2. 创建 .git 文件指向 bare 仓库(可选,方便在根目录操作): 在根目录创建一个 .git 文件,内容为 gitdir: .bare

  3. 添加 Worktree

    git worktree add main
    git worktree add feature-a

目录结构看起来像这样:

project/
├── .bare/        # Git 核心数据
├── main/         # 主分支工作区
├── feature-a/    # 功能 A 工作区
└── hotfix/       # 修复工作区

这样可以保持项目目录非常整洁,且所有工作区共享同一个 .git 仓库对象库,节省磁盘空间。