Git worktree 使用
git worktree 用于在当前仓库中创建一个工作目录,并将其与另一个分支关联起来。
现在有这样一个场景,我正在 dev-1
分支上开发,发现 main
分支有个 bug,需要修复。这时候就要基于 main
分支创建一个 hotfix-main
分支,然后在这个分支上修复 bug。
一般这个场景可能会使用 git stash
来解决,先暂存当前分支的修改,然后切换到 main
分支,修复 bug,然后切换回 dev-1
分支,恢复暂存。
- git stash
- git checkout main
- git checkout -b hotfix-main
- git commit -m “fix bug”
- git push # 推送到远程仓库
- git checkout dev-1 # 切换回 dev-1 分支
- 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