ᕕ( ᐛ )ᕗ Jimyag's Blog

Git worktree 使用

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,可以这样操作:

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

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

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 分支,继续开发。

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

下面是一些常用的命令:

# 创建一个工作目录,并将其与 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

#Git