背景
最近在用laravel開發微信小程式的介面,因為伺服器PHP版本的問題,分別用了laravel 5.6(php 7.1,開發環境)
和 laravel 5.4 (php 5.6,伺服器環境)
,開發完成後,兩個專案絕大部分的程式碼都差不多,不想再建一個倉庫放php 5.6
版的程式碼,便試著在原有倉庫新建分支來儲存php 5.6
的專案,搗鼓的一上午終於搞出來了,現在記錄下。
主要步驟:
- 在遠端和本地倉庫中新建一個分支(我建的是
laravel54
); - 刪除遠端
laravel54
分支上的所有檔案; - 將新專案的檔案推送到
laravel54
上。
流程
新建一個資料夾(我的是laravel5.4)
建立git本地倉庫並關聯遠端倉庫
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4
$ git init
Initialized empty Git repository in D:/PHP/xampp/htdocs/apple/laravel5.4/.git/
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (master)
$ git remote add origin git@xxxxxxxxxxxxxxxxxxxxx.git
建立遠端倉庫分支 laravel54
注意,建立遠端分支後,暫時還不能在本地建立其他分支,因為剛建立的git倉庫預設的master分支要在第一次commit之後才會真正建立,這時建立其他分支會報錯,解決辦法在後面說明。
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (master)
$ git branch laravel54
fatal: Not a valid object name: `master`.
隨便新建一個檔案,裡面可以不用寫任何東西,然後commit
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (master)
$ touch clearTheBranch
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (master)
$ git add clearTheBranch
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (master)
$ git commit -m`clean this branch`
[master (root-commit) c7c5349] clean this branch
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 clearTheBranch
推送之前先更新(下面的程式碼是最核心的程式碼)
新建的分支預設與master分支一樣,所以要在推送之前先把分支上的內容拉下來。
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (master)
$ git pull origin laravel54
warning: no common commits
remote: Enumerating objects: 2453, done.
remote: Counting objects: 100% (2453/2453), done.
remote: Compressing objects: 100% (2320/2320), done.
Receiviremote: Total 2453 (delta 1547), reused 229 (delta 89)
Receiving objects: 100% (2453/2453), 1.40 MiB | 1.38 MiB/s, done.
Resolving deltas: 100% (1547/1547), done.
From xxxxxxxxxxxxxxxxxxxxx
* branch laravel54 -> FETCH_HEAD
* [new branch] laravel54 -> origin/laravel54
fatal: refusing to merge unrelated histories
這個時候會報錯,是正常現象,,原因是本地倉庫和遠端倉庫不一樣,有類似兩者有完全不相同的commit歷史,只需要在在pull的同時加上一行程式碼即可,程式碼如下:
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (master)
$ git pull origin laravel54 --allow-unrelated-histories
From xxxxxxxxxxxxxxxxxxxxx
* branch laravel54 -> FETCH_HEAD
Merge made by the `recursive` strategy.
......
這步操作的時候,會有merge的commit說明,簡單寫下,這個只是merge的說明,並不會真正和mater合併。
經過這一步操作,就已經把遠端倉庫laravel54分支裡面的檔案都拉下來了,接下來建立與遠端倉庫對應的本地分支。
建立並切換到本地分支 laravel54
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (master)
$ git branch laravel54
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (master)
$ git checkout laravel54
Switched to branch `laravel54`
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54)
$
// 也可以直接用 git checkout -b laravel54
刪除本地倉庫裡的所有檔案(除了.git的資料夾),然後推送
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54)
$ git add .
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54)
$ git commit -m`delete all files`
[laravel54 d8bf12d] delete all files
215 files changed, 32019 deletions(-)
......
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54)
$ git push origin laravel54
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 683 bytes | 341.00 KiB/s, done.
Total 6 (delta 1), reused 1 (delta 0)
remote: Powered by Gitee.com
To xxxxxxxxxxxxxxxxxxxxx.git
c810298..d8bf12d laravel54 -> laravel54
這個時候,遠端倉庫的laravel54
分支便和本地倉庫的laravel54
分支一樣都是空白的,這樣就可以隨心所欲的推送了。
新專案推送
這時就可以把之前的專案拷進這個資料夾裡面,然後按照正常的推送流程進行推送。
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54)
$ git add .
warning: LF will be replaced by CRLF in .env.example.
The file will have its original line endings in your working directory.
.......
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54)
$ git commit -m`laravel54 push`
[laravel54 eba0954] laravel54 push
113 files changed, 11583 insertions(+)
create mode 100644 .env.example
create mode 100644 .gitattributes
.......
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54)
$ git push origin laravel54
Enumerating objects: 152, done.
Counting objects: 100% (152/152), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (126/126), done.
Writing objects: 100% (151/151), 211.43 KiB | 2.94 MiB/s, done.
Total 151 (delta 14), reused 42 (delta 4)
remote: Resolving deltas: 100% (14/14), done.
remote: Powered by Gitee.com
To xxxxxxxxxxxxxxxxxxxxx.git
d8bf12d..eba0954 laravel54 -> laravel54
小總結
不用擔心推送錯分支導致分支合併
經過如上操作,就可以實現master分支和laravel54是兩個完全不同的專案,可以保持兩個專案平行發展,因為兩個分支的提交歷史不一樣,所以即便是誤操作,提交錯了分支,git會給出相應的報錯,不會把兩個分支直接合並,下面是程式碼演示:
-
本地laravel54向遠端master分支推送
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54) $ touch a.txt 沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54) $ git add a.txt 沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54) $ git commit -m`test file a.txt` [laravel54 e246705] test file a.txt 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 a.txt 沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54) $ git push origin master To xxxxxxxxxxxxxxxxxxxxx.git ! [rejected] master -> master (fetch first) error: failed to push some refs to `git@xxxxxxxxxxxxxxxxxxxxx.git` hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., `git pull ...`) before pushing again. hint: See the `Note about fast-forwards` in `git push --help` for details. //本地版本回退 沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54) $ git log commit e246705e9894a658d3fb2ea8f51b1ee0dd8ff834 (HEAD -> laravel54) Author: muyan <xiao7shuang@qq.com> Date: Fri Jun 29 14:50:35 2018 +0800 test file a.txt commit eba09541b60e496127f6280c3db9611f72504744 (origin/laravel54) Author: muyan <xiao7shuang@qq.com> Date: Fri Jun 29 14:36:48 2018 +0800 laravel54 push commit d8bf12d9df1337f9f7e0de723608796a490f66dc Author: muyan <xiao7shuang@qq.com> Date: Fri Jun 29 14:24:02 2018 +0800 delete all files commit dcfb2b00f4f8ad0f1f672cde9b9e9ddc79d85239 (master) Merge: c7c5349 c810298 Author: muyan <xiao7shuang@qq.com> Date: Fri Jun 29 13:56:24 2018 +0800 Merge branch `laravel54` of xxxxxxxxxxxxxxxxxxxxx for claering the branch commit c7c5349779f868fbc1cf18d742d634c9d3267c32 Author: muyan <xiao7shuang@qq.com> Date: Fri Jun 29 13:55:01 2018 +0800 clean this branch 沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54) $ git reset eba09541b60e496127f6280c3db9611f72504744 //回退到上一次提交之前的版本 沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (laravel54) $ git status On branch laravel54 Untracked files: (use "git add <file>..." to include in what will be committed) a.txt nothing added to commit but untracked files present (use "git add" to track)
-
本地master分支向遠端master分支推送
沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (master) $ git add a.txt 沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (master) $ git commit -m `test file a` [master d3e8bba] test file a 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 a.txt 沐@ MINGW64 /d/PHP/xampp/htdocs/apple/laravel5.4 (master) $ git push origin master To xxxxxxxxxxxxxxxxxxxxx.git ! [rejected] master -> master (fetch first) error: failed to push some refs to `git@xxxxxxxxxxxxxxxxxxxxx.git` hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., `git pull ...`) before pushing again. hint: See the `Note about fast-forwards` in `git push --help` for details.