一 worktree 的基本概念和操作
二 语法速览
- 最简单的写法:
git worktree add <新路径>
将基于当前分支,新建一个 worktree 目录,新的分支名就是新建目录的名称。
- 新建一个指定分支
git worktree add <新路径> -b <新分支名>
将基于当前分支,新建一个 worktree 目录,新的分支名是指定的名称。
- 基于指定分支新建一个指定分支
git worktree add <新路径> -b <新分支名> <指定分支名>
将基于指定分支,新建一个 worktree 目录,新的分支名是指定的名称。
三 注意事项
- <新路径>
新路径一般是类似../myproject-bugfix
这样的命名,是相对路径,注意,这里一定是两个点:
**../**myproject-bugfix
表示在当前目录的父目录新建,这样才是与原工程目录平级。(当前,你当前得在原工程的跟目录中。)
总之,注意相对路径。
- 使用 git reset —hard 重置新的 worktree
如果使用了git worktree add <新路径>
最简单的方法新建,通常分支需要重新命名,基于的分支也要改。 可使用git reset --hard <要基于的分支名>
重置到想要的分支,使用git branch -D <想要删除的分支名>
删除自动创建的与目录名相同的分支。
四 其它废话
相比复制多个仓库,肯定是 worktree 的方式更高效。
当然,worktree 不允许两个 worktree 使用同一个分支。如果有这个需要怎么办?新建一个分支,reset 到目标分支,再基于这个新分支工作,效果一样。
但如果你经常需要在两个目录中使用同一个分支,那么可能是分支管理或工作方式需要改进。
另外,不使用的 worktree 尽早删除,并运行 git worktree prune
清理。
五 使用场景
worktree 是用来做什么的?
在团队合作中,通常会用多个分支来进行开发管理。设想一个场景,你目前正在 feature/a 分支愉快地开发新功能(代码位置在 .\awesome 文件夹),有些代码还在编写中,都没有提交。 此时,线上版本 release 分支出现了一个紧急 BUG 需要你修复。
在 feature/a 分支(或者说 .\awesome 文件夹) 还有一些未提交的修改,不希望被破坏,此时有如下方案解决这个问题。
1 可以使用 git stash 命令将未提交的修改暂存,然后新建一个分支修 BUG,回头在 git stash pop 把暂存的内容恢复。
2 在一个新的文件夹(比如 .\awesome-fix-bug ),使用 git clone 重新拉取仓库,然后新建一个分支,如 t/fix-bug 来修复 BUG。
使用 git clone 有一个问题是,如果仓库非常大(比如几个 G),clone 一次的时间是非常长的,worktree 就是用来解决这个问题的。
3 在 .\awesome 文件夹内执行如下命令 git worktree add ../awesome-fix-a-bug -b t/fixbug
就可以创建一个新文件夹,并创建一个新分支 t/fixbug,效果和 git clone 很像,
但是速度会非常快,因为复用了当前 git 的数据,不必完全再从服务器复制一份下来。
然后,切换到 awesome-fix-a-bug 文件夹,将 t/fixbug 分支重置到需要修复 BUG 的分支,如 git reset --hard origin/release
,就可以开始修复 BUG 了。
上述紧急修复 BUG 的场景,完整的 git 命令大致如下(注意,这里只是举例,具体应该怎么做,与你们团队的 git 工作流有关):
# 在 awesome 文件夹# 作用:创建一个新文件夹 awesome-fix-a-bug,并创建一个新分支 t/fixbug,这个分支是基于 awesome 文件夹中的代码所处的分支创建的git worktree add ../awesome-fix-a-bug -b t/fixbug
cd ../awesome-fix-a-bug# 在 awesome-fix-a-bug 文件夹git fetch # 拉取最新代码git reset --hard origin/release # 将 t/fixbug 分支重置为当前最新的 release 分支
# 开始就行编码,进行 BUG 修复
git push # 将 t/fixbug 分支推送到服务器,提交合并请求,准备进行代码审查
原文链接: https://blog.jgrass.cc/posts/git-worktree/
本作品采用 「署名 4.0 国际」 许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。