文章目录
1 前言
- 今天做项目开发时,发现切换分支后,有一个功能就会有问题,原因是因为两个分支的依赖项不一致,导致每次切换分支时都需要 npm install 一下,那有没有什么办法能做到依赖隔离呢?
- 我们切换分支开发时,若有不想提交的代码,一般是使用 git stash 暂存起来,然后 git checkout ,开发完成后再使用 git stash pop 将暂存取出来继续开发。但是 git checkout 的开发都是基于同一个文件进行修改,而 node_modules 都会被记录到 .gitignore 文件下进行 git 忽略,所以不会被 git stash 暂存上,如果有依赖变化,切换分支之后 node_modules 使用的是上一个分支的最新依赖,可能会导致原分支上的功能不可用。
- 使用 git worktree 可以做到依赖隔离,且只需要维护一个仓库,又可以同时在多个分支上进行工作
2 常用命令
2.1 查看所有 worktree
git clone 一个项目之后,都会有一个默认的 worktree
git worktree list
2.2 添加 worktree
git worktree add 路径名
git worktree addtest
- 在当前目录下新增一个 test 文件夹
- test 文件夹的内容为当前分支的克隆文件
- 默认新增一个 test 分支
git worktree add../test
- 在上一层级目录下新增一个 test 文件夹
- test 文件夹的内容为当前分支的克隆文件
- 默认新增一个 test 分支
git worktree add 路径名 -b 新分支名
git worktree addtest-b dev
- 在当前目录下新增一个 test 文件夹
- test 文件夹的内容为当前分支的克隆文件
- 新增一个 dev 分支
git worktree add 路径名 -b 新分支名 远程分支名
git worktree addtest-b dev origin/dev
- 在当前目录下新增一个 test 文件夹
- test 文件夹的内容为远程分支 origin/dev 的克隆文件
- 新增一个 dev 分支
2.3 移除 worktree
git worktree remove 工作树名
git worktree remove test
2.4 清洁 worktree
git worktree prune
3 图文详解
- vscode 打开 commitTest 文件夹,此时本地分支为 master 分支,在该分支上安装了一个 moment 包
- 新增一个名为 test 的 worktree 新生成的 test 文件夹下自动 clone 与本地 master 分支一样的内容(有eslint,但没有上一步在本地 master 分支上安装的 moment,只会 clone 已经 commit 的内容)
- 为了方便比较, 重新打开一个 vscode ,打开文件夹为 test 文件夹 安装 axios 包,并新增一个 txt 文件,此时, test 文件夹下的 node_modules 有 axios ,但没有 moment
- commitTest 文件夹下的 node_modules 只有 moment , 没有 axios , 依赖已隔离
- 可正常执行 git add 、 git commit 、 git push 等操作
- 远程仓库上新增了 test 分支, package.json 记录的安装包为 eslint 和 axios ,与本地 worktree 一致
- 执行 git worktree remove test , test 文件夹将被删除,但 test 分支会被保留
4 注意事项
- 当前 worktree 使用完后,记得执行 git worktree remove ,避免文件越来越多占用磁盘内存
- 建议新增 worktree 后, vscode 打开 worktree 新增的文件夹进行开发,否则没有修改内容对比
- 若本地存在与新增 worktree 同名分支,会 clone 与本地同名分支的内容
- 执行 git worktree add 路径名,默认生成与路径名同名的新分支
- 若本地没有同名分支,则 clone 内容为当前分支的克隆文件
- 若本地有同名分支,则 clone 内容为同名分支的克隆文件
在 master 分支上执行以下命令,新增一个名为 clone 本地分支
git worktree add clone
git worktree remove clone
git checkout dev
在 dev 分支上执行以下命令, copy 与 clone 文件夹下的内容不同
git worktree add copy
git worktree add clone
版权归原作者 YanaDH 所有, 如有侵权,请联系我们删除。