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 的興起,在不一樣文件夾中打開不一樣分支愈發變成了剛需。