
git worktree 用于在当前仓库中创建一个工作目录，并将其与另一个分支关联起来。

现在有这样一个场景，我正在 `dev-1` 分支上开发，发现 `main` 分支有个 bug，需要修复。这时候就要基于 `main` 分支创建一个 `hotfix-main` 分支，然后在这个分支上修复 bug。

一般这个场景可能会使用 `git stash` 来解决，先暂存当前分支的修改，然后切换到 `main` 分支，修复 bug，然后切换回 `dev-1` 分支，恢复暂存。

1. git stash
2. git checkout main
3. git checkout -b hotfix-main
4. git commit -m "fix bug"
5. git push # 推送到远程仓库
6. git checkout dev-1 # 切换回 dev-1 分支
7. git stash pop # 恢复暂存

如果使用 `git worktree`，可以这样操作：

```bash
git worktree add -b hotfix-main ../demo-repo-hotfix-main main
准备工作区（新分支 'hotfix-main'）
HEAD 现在位于 09e6b94 init main
```

这样就创建了一个 `hotfix-main` 分支的副本，并将其与 `main` 分支关联起来。

```bash
git worktree list
/private/tmp/git-worktree/demo-repo              09e6b94 [dev-1]
/private/tmp/git-worktree/demo-repo-hotfix-main  09e6b94 [hotfix-main]
```

现在 cd 到 `demo-repo-hotfix-main` 目录，就可以看到一个 `hotfix-main` 分支的副本，并且可以在这个副本上进行开发。原有的 `dev-1` 分支的修改还在，不会丢失。

在修复完后，就可以删除这个工作目录，然后切换回 `dev-1` 分支，继续开发。

```bash
git worktree remove ../demo-repo-hotfix-main
```

下面是一些常用的命令：

```bash
# 创建一个工作目录，并将其与 main 分支关联起来
git worktree add ../demo-repo-hotfix-main main

# 列出所有工作目录
git worktree list

# 删除一个工作目录
git worktree remove ../demo-repo-hotfix-main

# 锁定一个工作目录
git worktree lock ../demo-repo-hotfix-main --reason="正在修复重要bug"

# 列出所有工作目录，并显示详细信息
git worktree list --porcelain

# 输出结果示例
# worktree /private/tmp/git-worktree/demo-repo
# HEAD 09e6b9444de957d6cb1db00864083b01119ded99
# branch refs/heads/dev-1

# worktree /private/tmp/git-worktree/demo-repo-hotfix-main
# HEAD 09e6b9444de957d6cb1db00864083b01119ded99
# branch refs/heads/hotfix-main
# locked 正在修复重要 bug

# 删除一个被锁定的工作目录
git worktree remove ../demo-repo-hotfix-main
# 致命错误：无法删除一个锁定的工作区，锁定原因：正在修复重要 bug
# 使用 'remove -f -f' 覆盖或先解锁

# 解锁一个工作目录
git worktree unlock ../demo-repo-hotfix-main
# 输出结果示例

# 移动一个工作目录
git worktree move ../demo-repo-hotfix-main ../demo-repo-hotfix-main-move

```

