蒙蒙plus
蒙蒙plus
Published on 2025-12-10 / 33 Visits
0
0

Git多工作区使用指南

Git 多工作区使用指南

目录


一、克隆仓库并将 .git 放到指定位置

1.1 使用 --separate-git-dir 克隆(推荐)

# 基本语法
git clone --separate-git-dir=<.git目录路径> <仓库地址> <工作目录路径>

# 实际示例
git clone --separate-git-dir=D:\workspace\01.370866\.repo\projects\30.001.000248.git \
  ssh://git@192.168.21.7:222/01.370866/30.001.000248.git \
  F:\workspace\01.370866\30.001.000248

说明:

  • --separate-git-dir:指定 .git 目录的存放位置
  • 工作目录路径:可选,不指定则使用仓库名作为目录名
  • 克隆后,工作目录中会有一个 .git 文件(不是目录),内容指向实际的 .git 目录

1.2 使用 Git 别名快速克隆(已配置)

已配置全局别名 git clone-separate,默认将 .git 放到 /c/Users/cheng/git-repos/仓库名.git

# 使用默认位置
git clone-separate <仓库地址>

# 指定工作目录
git clone-separate <仓库地址> <工作目录名>

# 使用自定义位置(通过环境变量)
GIT_DIR_BASE=/d/my-git-repos git clone-separate <仓库地址>

1.3 克隆后移动 .git 目录(备选方案)

# 1. 正常克隆
git clone <仓库地址> <工作目录>

# 2. 移动 .git 目录到指定位置
move <工作目录>\.git D:\git-repos\仓库名.git

# 3. 创建指向新位置的链接文件
echo gitdir: D:\git-repos\仓库名.git > <工作目录>\.git

二、创建多个工作区

2.1 基本概念

  • 主工作区:首次克隆时创建的工作目录
  • 附加工作区:使用 git worktree add 创建的工作目录
  • 共享仓库:所有工作区共享同一个 .git 目录
  • 独立分支:每个工作区可以检出不同的分支,互不干扰

2.2 创建工作区

为已存在的分支创建工作区

# 语法
git worktree add <工作区路径> <分支名>

# 示例:为 develop 分支创建工作区
cd F:\workspace\01.370866\30.001.000248
git worktree add ../project_develop develop

# 示例:为 feature/ydq13 分支创建工作区
git worktree add ../project_ydq13 feature/ydq13

创建新分支并创建工作区

# 语法
git worktree add <工作区路径> -b <新分支名>

# 示例:创建新分支 feature/new-feature 并创建工作区
git worktree add ../project_new_feature -b feature/new-feature

# 从指定分支创建新分支
git worktree add ../project_feature -b feature/new-feature develop

从远程分支创建工作区

# 先获取远程分支
git fetch origin

# 基于远程分支创建工作区
git worktree add ../project_remote -b feature/remote origin/feature/remote

2.3 查看所有工作区

# 查看所有工作区列表
git worktree list

# 输出示例:
# D:/workspace/01.370866/.repo/projects/30.001.000248.git  0592f6a [feature/cross_sensor]
# F:/workspace/01.370866/project_develop                   4c1dd01 [develop]

说明:

  • 第一列:工作区路径
  • 第二列:当前提交的哈希值
  • 第三列:当前检出的分支名(方括号内)

2.4 删除工作区

# 正常删除(需要先切换到其他工作区)
git worktree remove <工作区路径>

# 强制删除(即使有未提交的更改)
git worktree remove --force <工作区路径>

# 示例
git worktree remove ../project_develop

注意:

  • 删除工作区不会删除分支
  • 删除工作区不会删除 .git 仓库
  • 只能删除附加工作区,不能删除主工作区

三、日常使用操作

3.1 在不同工作区工作

# 切换到工作区1(feature/cross_sensor 分支)
cd F:\workspace\01.370866\30.001.000248\project_iar8_ydq13
# 进行编辑、提交等操作
git add .
git commit -m "feat: 添加新功能"
git push gltech feature/cross_sensor

# 切换到工作区2(develop 分支)
cd F:\workspace\01.370866\project_develop
# 进行编辑、提交等操作
git add .
git commit -m "fix: 修复bug"
git push gltech develop

3.2 查看其他工作区的提交

在任何工作区都可以查看所有分支的提交历史:

# 查看指定分支的提交
git log <分支名> --oneline

# 示例:在工作区1查看 develop 分支的提交
git log develop --oneline

# 查看所有分支的提交图
git log --all --graph --oneline --decorate

# 查看特定分支的最新提交
git log <分支名> -5

3.3 同步远程仓库

# 在任何工作区都可以拉取所有分支的最新更改
git fetch --all

# 拉取特定远程仓库的所有分支
git fetch gltech
git fetch rh1288

# 查看远程分支
git branch -r

# 查看所有分支(本地+远程)
git branch -a

3.4 合并分支

# 在工作区1合并 develop 分支到当前分支
cd project_iar8_ydq13
git merge develop

# 或者使用 rebase
git rebase develop

3.5 切换工作区的分支

# 在工作区内切换分支(会更新工作区文件)
cd project_develop
git checkout feature/cross_sensor

# 注意:如果该分支已被其他工作区使用,会提示错误
# 错误信息:fatal: 'feature/cross_sensor' is already checked out at '...'

最佳实践: 每个工作区固定使用一个分支,需要切换分支时创建新的工作区。


四、常见场景

场景1:同时开发多个功能分支

# 1. 为主功能创建工作区
git worktree add ../project_main -b feature/main-feature

# 2. 为次要功能创建工作区
git worktree add ../project_side -b feature/side-feature

# 3. 在不同工作区并行开发
cd project_main
# 开发主功能...

cd project_side
# 开发次要功能...

场景2:修复生产环境 bug 同时开发新功能

# 1. 从 master 创建 hotfix 工作区
git worktree add ../project_hotfix -b hotfix/critical-bug master

# 2. 从 develop 创建新功能工作区
git worktree add ../project_feature -b feature/new-feature develop

# 3. 在 hotfix 工作区修复 bug
cd project_hotfix
# 修复并提交
git commit -m "fix: 修复严重bug"
git push gltech hotfix/critical-bug

# 4. 在 feature 工作区继续开发
cd project_feature
# 继续开发...

场景3:代码审查和测试

# 1. 为待审查的分支创建工作区
git worktree add ../project_review feature/pull-request

# 2. 在独立工作区中测试和审查
cd project_review
# 编译、测试、审查代码...

# 3. 审查完成后删除工作区
cd ..
git worktree remove project_review

场景4:对比不同版本的代码

# 1. 为不同版本创建工作区
git worktree add ../project_v1.0 v1.0.0
git worktree add ../project_v2.0 v2.0.0

# 2. 使用对比工具比较两个工作区
# 或使用 git diff
cd project_v1.0
git diff v2.0.0

五、故障排除

5.1 工作区被锁定

问题: 删除工作区时提示 “worktree is locked”

解决:

# 检查锁定文件
ls -la <工作区路径>/.git

# 手动删除锁定文件
rm <工作区路径>/.git/index.lock

# 然后重新删除工作区
git worktree remove <工作区路径>

5.2 分支已被其他工作区检出

问题: 切换分支时提示 “branch is already checked out”

解决:

# 查看哪个工作区在使用该分支
git worktree list

# 选项1:在对应工作区切换分支后再切换
cd <使用该分支的工作区>
git checkout other-branch
cd <目标工作区>
git checkout <目标分支>

# 选项2:创建新工作区使用该分支
git worktree add ../new-worktree <分支名>

5.3 工作区目录被手动删除

问题: 手动删除了工作区目录,但 Git 仍记录该工作区

解决:

# 清理无效的工作区记录
git worktree prune

# 或强制清理
git worktree remove --force <已删除的工作区路径>

5.4 查看工作区详细信息

# 查看工作区状态
git worktree list --verbose

# 查看工作区的 Git 配置
cd <工作区路径>
git config --list --local

# 查看工作区关联的分支
git branch --show-current

六、最佳实践

6.1 工作区命名规范

# 推荐:使用分支名作为工作区目录名
git worktree add ../project_develop develop
git worktree add ../project_feature_cross_sensor feature/cross_sensor

# 或使用描述性名称
git worktree add ../hotfix_critical_bug -b hotfix/critical-bug

6.2 工作区管理

  • ✅ 每个工作区固定使用一个分支
  • ✅ 定期清理不再使用的工作区
  • ✅ 使用 git worktree list 定期检查工作区状态
  • ❌ 不要在工作区之间手动复制 .git 目录
  • ❌ 不要手动修改工作区中的 .git 文件

6.3 分支管理

  • 主工作区通常用于主要开发分支(如 developmaster
  • 功能分支使用独立工作区
  • 临时分支(如 hotfix)使用独立工作区,完成后删除

6.4 性能考虑

  • Git Worktree 适合需要同时处理多个分支的场景
  • 所有工作区共享同一个 .git 目录,节省磁盘空间
  • 工作区之间切换只需切换目录,无需切换分支

七、快速参考命令

# === 克隆仓库 ===
git clone --separate-git-dir=<.git路径> <仓库地址> <工作目录>
git clone-separate <仓库地址> [工作目录]

# === 工作区管理 ===
git worktree add <路径> <分支>          # 创建新工作区
git worktree add <路径> -b <新分支>     # 创建新分支和工作区
git worktree list                       # 列出所有工作区
git worktree remove <路径>              # 删除工作区
git worktree prune                      # 清理无效工作区

# === 查看信息 ===
git log --all --graph --oneline         # 查看所有分支提交图
git branch -a                           # 查看所有分支
git fetch --all                         # 拉取所有远程分支

# === 常用操作 ===
cd <工作区路径>                          # 切换到工作区
git status                              # 查看当前状态
git branch                              # 查看当前分支

八、实际项目示例

当前项目配置

仓库位置: D:\workspace\01.370866\.repo\projects\30.001.000248.git

工作区列表:

  • 主工作区:F:\workspace\01.370866\30.001.000248\project_iar8_ydq13 (feature/cross_sensor)
  • 工作区2:F:\workspace\01.370866\project_develop (develop)

远程仓库:

  • gltech: ssh://git@192.168.21.7:222/01.370866/30.001.000248.git
  • rh1288: ssh://git@gitea.mengplus.top:222/01.315101/30.001.000248.git

常用工作流

# 1. 在主工作区开发功能
cd F:\workspace\01.370866\30.001.000248\project_iar8_ydq13
git add .
git commit -m "feat: 新功能"
git push gltech feature/cross_sensor

# 2. 在 develop 工作区同步最新代码
cd F:\workspace\01.370866\project_develop
git fetch --all
git merge gltech/develop

# 3. 创建新的功能分支工作区
cd F:\workspace\01.370866\30.001.000248
git worktree add ../project_new_feature -b feature/new-feature develop

最后更新: 2024-12-10
适用版本: Git 2.5+


Comment