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

相關文章
相關標籤/搜索