Git Worktree:解决分支依赖冲突的问题

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

  • 你想将项目的 react 版本从 15 升级到 16 ,并尝试使用一些 16 的新特性,所以创建了一个新的分支,但在这期间,你还要在原分支上维护老版本的项目,互相切换时 react 版本会冲突覆盖
  • dev 分支中是全新的内容,但你有些代码片断但愿从原来的 master 分支直接拷贝,互相切换后看不到其它分支的代码

以上问题,究其缘由是 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

改造步骤以下:

  1. 将 gitview 文件夹的所有内容移动到 gitview/gitview-master文件夹
  2. 在 gitview-master 目录下执行 git worktree add ../gitview-react-native -b react-native
  3. 在 gitview/gitview-react-native 目录下执行 git push --set-upstream origin react-native
  4. 删除 gitview/gitview-master 下除了 .git 文件夹的所有内容,再添加所需内容,并add、commit、push
  5. 在 gitview-master 目录下执行 git worktree add ../gitview-weixin -b weixin
  6. 在 gitview/gitview-weixin 目录下添加相应内容,并add、commit、push
  7. 在 gitview/gitview-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 的兴起,在不一样文件夹中打开不一样分支愈发变成了刚需。

相关文章
相关标签/搜索