使用 git worktree 在同一个项目多个分支上并行开发
设想这样一个场景:你正在 ProjectA 项目上进行开发,当前分支为 dev,突然同事需要你在 fix 分支上协助排查一个紧急问题。
方案一
你立马想到的做法是,把当前 dev 分支上已经修改的代码暂存起来('git stash'),再将工程切换到 fix 分支上进行开发,把 fix 分支上的问题修复完代码提交之后,再切回 dev 分支,将之前暂存的代码还原后继续开发。
如果 fix 分支上的代码还需要再修改,你就又得再次暂存 dev 上的代码,重复上面的步骤,在 dev 和 fix 两个分支上来回切换。
这种方式的弊端:
1. 需要来回切换分支和暂存代码,很麻烦
2. 如果是中大型规模的编译型项目,每次切换分支,IDE 都会重建索引,项目编译运行也会耗费更多时间
3. 暂存的代码再还原,如果有冲突的话,解决冲突会增加出错的机率
这样来回多折腾几次,大部分程序员为了避免麻烦,都会想到下面的方案。
方案二
将 ProjectA 整个项目重新拷贝一份,命名为 ProjectA2,在此代码库中切换到 fix 分支进行开发,这样两个独立的项目就可以互不干扰。
这种方式的弊端:
1. 完全手动操作
2. 磁盘空间占用大:如果当前项目已经迭代很久,.git 目录的容量以 G 为单位,每多一份拷贝,占用的磁盘空间就会急剧增加
方案三
使用 git 内置的 git worktree 工具。
这种方式与方案二思想一致,也是在独立项目独立分支上开发,但是会完全避免方案二的弊端。
每一个 git 仓库下可以创建多个 worktree,每个 worktree 相当于当前项目的一个“拷贝”。(这里的拷贝不是完全拷贝)
在当前项目 ProjectA 中使用命令 'git worktree list',可查看当前 git 仓库下已存在的 worktrees,默认当前包含 .git 目录的项目是 main worktree,不可被删除。
git worktree list
/path/to/ProjectA ba528d6 [dev]
使用 'git worktree add' 命令创建一个新的 worktree (-b 同时创建一个新分支)
git worktree add ../ProjectA2 -b fix Preparing worktree (new branch 'fix') HEAD is now at ba528d6 basic data structures git worktree list /path/to/ProjectA ba528d6 [dev] /path/to/ProjectA2 ba528d6 [fix]
在 ProjectA2 上任务完成之后,使用 'git worktree remove ProjectA2' 移除即可。
使用 git worktree 的优点:
1. add 和 remove 都是 git 自动完成,不需要程序员手动操作
2. 不会使磁盘空间急剧增加
add worktree 实际是在指定的目录下拷贝一份与当前分支相关的所有代码,但不会拷贝项目 ProjectA 的 .git 目录,只在 ProjectA2 中创建一个 .git 文件指向 ProjectA 的 .git 目录,使多个 worktrees 可以共享 ProjectA 的所有 git 提交信息
更多 git worktree 使用细节及指令说明可参考官方文档
https://git-scm.com/docs/git-worktree
浙公网安备 33010602011771号