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 是一个非常实用的功能,特别适合需要频繁在多个分支之间切换的场景。

相关推荐
先跑起来再说6 小时前
Git 入门到实战:一篇搞懂安装、命令、远程仓库与 IDEA 集成
ide·git·后端·elasticsearch·golang·intellij-idea
承渊政道9 小时前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee
Doro再努力9 小时前
【Linux操作系统12】Git版本控制与GDB调试:从入门到实践
linux·运维·服务器·git·vim
摇滚侠12 小时前
MAC IDEA GIT 提交区显示了几个不存在的目录
git·idea
城东13 小时前
Git使用[远程仓库远端的head比本地和提交的head旧,其他人拉不到最新代码]
git·head·远程仓库远端·比本地和提交的head旧·其他人拉不到最新代码
何中应21 小时前
使用SSH地址拉取远程仓库代码报下面的错误
git
何中应21 小时前
Git本地仓库命令补充
git
sun0077001 天前
执行repo sync -c -d -j4以后,提交未git push的代码看不到了。要怎么恢复?
git
胖虎11 天前
Git 一个本地仓库同时推送到两个远程仓库(详细教程)
git·多远程仓库·双远程仓库·git双远程·git备份
春日见2 天前
如何创建一个PR
运维·开发语言·windows·git·docker·容器