Skip to content

git worktree

Published: at 19:48

一 worktree 的基本概念和操作

再也不用克隆多个仓库啦!git worktree 一个 git 仓库可以连接多个工作目录 - walterlv

二 语法速览

将基于当前分支,新建一个 worktree 目录,新的分支名就是新建目录的名称。

将基于当前分支,新建一个 worktree 目录,新的分支名是指定的名称。

将基于指定分支,新建一个 worktree 目录,新的分支名是指定的名称。

三 注意事项

表示在当前目录的父目录新建,这样才是与原工程目录平级。(当前,你当前得在原工程的跟目录中。)
总之,注意相对路径。

四 其它废话

相比复制多个仓库,肯定是 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 工作流有关):

Terminal window
# 在 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 国际」 许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。