学习下git的worktree
我们在开发中还是有挺多时候会需要经常切换分支,比如在项目A的过程中突然要修个bug,或者想去看看另一个分支的代码逻辑是怎么样的等等
如果频繁的切换分支,那要不就是经常git stash,有时候甚至会忘了已经开发了的代码,要不就是写到一半提交
最近发现了worktree这个功能,
比如我有一个仓库叫repo0,有两个分支main和feat1,
我可能需要在feat1上开发,但是偶尔又要回main上看看代码逻辑等
我就可以使用worktree,
比如我就是创建一个feat1的worktree1
git worktree add ../feat1 feat1
就会在repo0的同级目录创建一个feat1
这样就会变成两个目录对应的不同分支,但优点是啥呢,因为这是git天然支持的,不是我们直接clone了两份,会有两个.git目录,这样就省掉了很大的版本管理空间
另外我们仓库路径下就是个主的worktree
这样呢其实还有一个现在比较时兴的好处,就是如果有多个agent,就可以开多个worktree,一个开发新代码,一个写单测,一个review代码,加快流水线并行化速度
对应的常用参数可以看一下help1
2
3
4
5
6
7
8
9usage: 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还是挺好用的
之前还不知道,最近是跟着最新这波龙虾热才知道
想要搞个数字团队
分工各司其职
正好可以用到这个功能