git worktree 命令可在不一样文件夹中打开同一个 git 仓库的不一样分支,很好的解决不一样分支 node_modules 依赖冲突的问题。前端
将一个项目不一样平台的版本放在 git 仓库的不一样分支,是一种常见的作法。好比我最近在考虑开发 Gitview (项目连接 )的小程序版,计划将原先 React Native 版的代码放到名为 react-native 的分支,小程序版在一个新的名为 weixin 的分支中开发,master 分支中将只放简介和各分支的索引连接。node
因为 node_modules 文件夹是在 .gitignore 之中的,git 不会对其有任何记录或操做,所以不一样分支不会有本身独立的 node_modules,使用 git checkout
命令切换时,项目里仍是同一个 node_modules 文件夹。react
此时在各分支直接执行 npm install
的话,各分支 package.json 中对应的依赖都会被放到同一个 node_modules 文件夹。若是同一个依赖不一样分支的版本不一致,则会冲突覆盖,发生问题。git
相似问题还会出如今如下场景:github
以上问题,究其缘由是 git checkout
命令是在同一个文件夹中切换不一样分支。npm
怎么解决呢,一个思路是不一样的分支 clone 到不一样的文件夹,但这样就是相互彻底独立的仓库了,不能merge。编程
那有没有办法能在不一样的文件夹中打开同一个仓库的不一样分支呢,这就要介绍今天的主角:git worktree
命令了:json
git worktree add [-f] [--detach] [--checkout] [--lock] [-b <new-branch>] <path> [<commit-ish>]
git worktree list [--porcelain]
git worktree lock [--reason <string>] <worktree>
git worktree move <worktree> <new-path>
git worktree prune [-n] [-v] [--expire <expire>]
git worktree remove [-f] <worktree>
git worktree unlock <worktree>
复制代码
每一个命令详细的介绍请看文档(连接 ),下面以对 Gitview (项目连接 )改造为例进行讲解:小程序
本来 Gitview 只有一个 master 分支,为 React Native 版本的代码,本地仓库为 gitview 文件夹,如今但愿将 React Native 版本的代码移动到 react-native 分支,新建 weixin 分支进行小程序开发,master 分支做为索引。react-native
改造步骤以下:
git worktree add ../gitview-react-native -b react-native
git push --set-upstream origin react-native
git worktree add ../gitview-weixin -b weixin
git push --set-upstream origin weixin
这样 gitview 项目在本地和 GitHub 远端都有了 master、react-native、weixin 三个分支,在本地三个分支分别被放置在 gitview/gitview-master、gitview/gitview-react-native、gitview/gitview-weixin 文件夹,但它们同属一个仓库,相互merge没有问题,在对应文件夹下打开 git bash 就是在对应的分支,无需经过 git checkout
命令。
注意在执行 git worktree add
的时候,不要将目录指定在当前目录下(./),而应该指定在当前目录的同级目录(../),不然新分支的文件夹又会被添加到原分支中。
使用 git worktree
建议将 git 升级到最新版本,由于其中的好几个命令是最近几个版本才加入的。事实上,git worktree
命令是2015年9月的2.6.0版本才推出的。这其中的缘由我的认为多是,在过去的编程语言中,项目的依赖库不在项目目录中, git checkout
不会遇到依赖不一样的问题,而npm 管理的项目中,依赖被放在项目目录中的 node_modules 文件夹中,故随着前端开发和 npm 的兴起,在不一样文件夹中打开不一样分支愈发变成了刚需。