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 Squash 合并与文件排除流程
git
wunaiqiezixin8 小时前
git常用命令总结
git
Pluchon13 小时前
萌萌技术分享笔记——Java综合项目
java·开发语言·笔记·git·github·mybatis·postman
九思x14 小时前
Git脚本汇总
git
jiayong2314 小时前
git分支合并的切换逻辑详解
git
思麟呀15 小时前
Git入门
git
Ws_15 小时前
Git + Gerrit 第八课:reset 与 revert 撤销提交
git
Qres82115 小时前
hexo博客上传github page
git·github·hexo
繁星星繁15 小时前
Git 入门之道:从版本流转到基础操作
大数据·git·elasticsearch
wh_xia_jun1 天前
Git 分支合并操作备忘录
git