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

相关推荐
qq_435287921 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
AIMath~8 小时前
Git 子模块(Submodule)目录结构清除实战复盘
git
切糕师学AI8 小时前
Ubuntu 下 Git 完全使用指南
linux·git·ubuntu
一袋米扛几楼9810 小时前
【Git】规范化协作:详解 GitHub 工作流中的 Issue、Branch 与 Pull Request 最佳实践
前端·git·github·issue
尘埃落定wf11 小时前
# GitHub CLI:告别繁琐的 Git 命令,让开发更高效
git·github
恋喵大鲤鱼11 小时前
git clone
git·git clone
金牛IT13 小时前
Gogs 轻量级 Git 服务器搭建与使用
运维·服务器·git
Qres8211 天前
Git安装记录
git
wj3055853781 天前
Codex + Git 开发环境配置指南(WSL版)
linux·运维·git
楠枬1 天前
Git 分支管理
git