学习下git的worktree

我们在开发中还是有挺多时候会需要经常切换分支,比如在项目A的过程中突然要修个bug,或者想去看看另一个分支的代码逻辑是怎么样的等等
如果频繁的切换分支,那要不就是经常git stash,有时候甚至会忘了已经开发了的代码,要不就是写到一半提交
最近发现了worktree这个功能,
比如我有一个仓库叫repo0,有两个分支main和feat1,
我可能需要在feat1上开发,但是偶尔又要回main上看看代码逻辑等
我就可以使用worktree,
比如我就是创建一个feat1的worktree

1
git worktree add ../feat1 feat1

就会在repo0的同级目录创建一个feat1
这样就会变成两个目录对应的不同分支,但优点是啥呢,因为这是git天然支持的,不是我们直接clone了两份,会有两个.git目录,这样就省掉了很大的版本管理空间
另外我们仓库路径下就是个主的worktree
这样呢其实还有一个现在比较时兴的好处,就是如果有多个agent,就可以开多个worktree,一个开发新代码,一个写单测,一个review代码,加快流水线并行化速度
对应的常用参数可以看一下help

1
2
3
4
5
6
7
8
9
usage: git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]
[-b <new-branch>] <path> [<commit-ish>]
or: git worktree list [-v | --porcelain [-z]]
or: git worktree lock [--reason <string>] <worktree>
or: git worktree move <worktree> <new-path>
or: git worktree prune [-n] [-v] [--expire <expire>]
or: git worktree remove [-f] <worktree>
or: git worktree repair [<path>...]
or: git worktree unlock <worktree>

第一个就是add,像我刚才就是指定了worktree的路径和对应的分支,如果直接是路径就会找这个路径名对应的分支,如果不存在跟路径同名的分支,就是新建分支
而如果后面是分支名,就会切到这个分支,它还可以是tag,commit-id;
还有比如我只是想做一些实验性的改动
可以用

add命令

1
git worktree add -d <path>

它不会新建分支,创建一个不与任何分支关联的 throwaway worktree(一次性工作树)。

list命令

1
git worktree list

另外像git worktree list就是查看当前仓库有哪些worktree

lock命令

1
git worktree lock

lock是说我的worktree可能会被移动,防止文件被破坏,我需要进行锁定

move命令

1
git worktree move <worktree> <new-path>

move就是把worktree移动到一个新的路径

remove命令

1
git worktree remove

remove就是删除worktree,
但有个前提是不能删除还有代码没提交,有未提交的变更这种

prune命令

1
git worktree prune

这个其实更偏向于git来清理所管理的worktree,比如worktree的目录直接被删掉不用了

repair命令

1
git worktree repair 

修复命令是指比如我们的主worktree被移动了,
那需要修复其他的worktree的引用关系
就可以用这个命令

unlock命令

1
git worktree unlock 

这个跟刚才的lock就是互为反操作
如果对一个仓库有这种多分支并行操作,
用worktree还是挺好用的
之前还不知道,最近是跟着最新这波龙虾热才知道
想要搞个数字团队
分工各司其职
正好可以用到这个功能