Git 实战:我用 git worktree 一次性拉取多个工作目录

这篇文章主要讲解 git worktree 在我日常开发工作流中的使用。

背景说明

先来看下我的工作场景。

首先,要开发一个新功能,此时拉取一个功能分支,如:"feat/xxx"。 然后测试说生产环境发现一个bug,需要紧急修复,此时拉取一个bug修复分支,如:"fix/yyy"。 接着,产品经理说一个紧急需求要做,没办法,再创建一个分支 ,如:"feat/zzz"。

对于这样一个场景,需要在多个分支里工作。我可不想每次代码写一半,然后贮藏起来,这样太麻烦了。

这样,git worktree 就派上用场了。

官方对这个命令的描述是:一个 git 仓库可以支持多个工作区,允许你一次签出多个分支

使用

基础命令

添加新的工作区

bash 复制代码
git worktree add <路径> <分支名>

例如,为修复 bug 创建一个新的工作区:

bash 复制代码
git worktree add ../fix-yyy fix/yyy

这会在当前目录的外层创建一个名为 fix-yyy 的目录,这个目的会处于 fix/yyy 分支。

基于远程分支创建工作区

如果分支在远程仓库但本地没有,可以直接基于远程分支创建:

bash 复制代码
git worktree add ../fix-yyy origin/fix/yyy

创建新分支的工作区

如果分支还不存在,使用 -b 参数创建新分支:

bash 复制代码
git worktree add -b feat/zzz ../feat-zzz

查看所有工作区

bash 复制代码
git worktree list

输出示例:

javascript 复制代码
D:/project/main           abc1234 [main]
D:/project/fix-yyy        def5678 [fix/yyy]
D:/project/feat-zzz       ghi9012 [feat/zzz]

删除工作区

工作区可以使用下面命令删除:

bash 复制代码
git worktree remove <工作区路径>

清理工作区记录

有时工作区目录被手动删除,但 Git 还记录着,可以用以下命令清理:

bash 复制代码
git worktree prune

实战案例

让我用一个完整的案例演示如何使用 git worktree 管理多个工作分支。

场景:

  • 主项目在 D:\projects\myapp 目录
  • 正在 main 分支开发新功能
  • 突然需要修复生产环境 bug
  • 同时产品经理要求紧急开发一个新功能

步骤 1:查看当前状态

bash 复制代码
cd D:\projects\myapp
git worktree list

输出:

javascript 复制代码
D:/projects/myapp  a1b2c3d [main]

步骤 2:为 bug 修复创建工作区

bash 复制代码
# 拉取远程最新代码
git fetch origin

# 基于远程的 hotfix 分支创建工作区
git worktree add ../myapp-hotfix origin/hotfix/fix-login-issue

# 或者创建新的 hotfix 分支
git worktree add -b hotfix/fix-payment ../myapp-hotfix

步骤 3:为紧急需求创建工作区

bash 复制代码
git worktree add -b feat/urgent-feature ../myapp-urgent

步骤 4:查看所有工作区

bash 复制代码
git worktree list

输出:

javascript 复制代码
D:/projects/myapp          a1b2c3d [main]
D:/projects/myapp-hotfix   e4f5g6h [hotfix/fix-payment]
D:/projects/myapp-urgent   i7j8k9l [feat/urgent-feature]

步骤 5:在不同工作区之间切换

现在你可以在不同的目录中工作,无需切换分支:

bash 复制代码
# 修复 bug
cd D:\projects\myapp-hotfix
# ... 编写代码,提交
git add .
git commit -m "fix: 修复支付问题"
git push origin hotfix/fix-payment

# 开发紧急功能
cd D:\projects\myapp-urgent
# ... 编写代码,提交
git add .
git commit -m "feat: 添加紧急功能"
git push origin feat/urgent-feature

# 回到主开发
cd D:\projects\myapp
# 继续原来的工作

步骤 6:完成后清理工作区

当分支合并完成后,删除不再需要的工作区:

bash 复制代码
# 删除 hotfix 工作区
git worktree remove ../myapp-hotfix

# 删除紧急功能工作区
git worktree remove ../myapp-urgent

# 清理已删除工作区的记录
git worktree prune

最佳实践

1. 统一的目录结构

建议将所有工作区放在同一父目录下,便于管理:

bash 复制代码
projects/
├── myapp/          # 主工作区(main 分支)
├── myapp-dev/      # 开发分支
├── myapp-feat1/    # 功能分支 1
├── myapp-feat2/    # 功能分支 2
└── myapp-hotfix/   # 热修复分支

2. 命名规范

工作区目录命名建议包含项目名和分支类型:

  • <项目>-<分支类型> 例如:myapp-dev, myapp-hotfix
  • <项目>-<功能描述> 例如:myapp-payment, myapp-auth

3. 定期清理

定期检查并清理不再使用的工作区:

bash 复制代码
# 查看所有工作区
git worktree list

# 删除不需要的工作区
git worktree remove <路径>

# 清理记录
git worktree prune

总结

git worktree 是一个非常实用的功能,特别适合需要频繁在多个分支之间切换的场景。

相关推荐
import_random2 小时前
[git版本控制]git pull origin main
git
ShallowLin2 小时前
Git 的分支管理
git
chen_2276 小时前
搭建git工作流
git
Rabbit_QL10 小时前
【git reset】个人分支一次精准撤回 git push 的实战记录
git
掘金忠实用户程序员10 小时前
Git多仓库协作场景
git
少年攻城狮10 小时前
Git系列---【git拉代码时报getaddrinfo() thread failed to start】
git
cicada1510 小时前
分享一个git日常开发流程
大数据·git·elasticsearch
布只道10 小时前
关于Git的一些小秘密
git
无限进步_11 小时前
【C语言&数据结构】二叉树链式结构完全指南:从基础到进阶
c语言·开发语言·数据结构·c++·git·算法·visual studio