git無衝突多分支提交詳解

第一部分:git常用命令

<1>下載服務器代碼到本地: git clone 服務器代碼倉庫地址

<2>查看本地分支:git branch

<3>查看本地+遠程分支:git branch 

<4>分支跳轉:git checkout 分支名

<5>將文件加入git管理:git add 文件名

<6>查看提交狀態:git status

<7>提交代碼:git commit 文件名 -m “說明”

<8>在父分支上下拉服務器(正本)代碼:git pull

<9>推送代碼到服務器(正本):git push(注意,這個命令執行前提是當前所在分支的分支名等於服務器分支名)

<10>查看提交歷史:git log -10 (10是想查看的歷史條數,可任意設置)

<11>版本回退:git reset --hard 提交歷史哈希串

<12>創建新分支: 

[方式1]git branch 新分支名(只創建,不跳轉進去) 

[方式2]git checkout -b 新分支名 (創建,且直接跳轉進去)

—————————————————————————————————————————————————————————————————————————————————————————————————————————————

第二部分:mac系統上安裝git

因爲Xcode自帶git中的rebase命令實際操作效果等同於merge命令,而無衝突提交需要的最重要的命令恰好是rebase,所以在mac系統上需要下載完整的git

步驟1:安裝包管理工具HomeBrew

     ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

     這一行代碼可能因爲複製格式問題在終端上直接執行不成功,去百度搜索homebrew,第一個就是HomeBrew的官網,其中有這條命令,直接拷貝下來執行

步驟2:通過brew命令安裝git

    brew install git

—————————————————————————————————————————————————————————————————————————————————————————————————————————————

第三部分:git開發的四個分支介紹

【1】服務器代碼(遠端)正本分支,*一級提交分支

         真正的服務器代碼倉庫,用於正式提交代碼,一般不可逆

【2】服務器代碼(本地)副本分支,*分佈式存儲、遠程跟蹤、協助提交

         服務器代碼倉庫在本地的備份(副本),跟蹤服務器最新代碼,一套代碼在服務器和每個開發者的本地都有多份拷貝,這就實現了git的分佈式存儲,如果服務器壞了,任何一個開發者本地的副本都可以安全的保存完整代碼。

【3】父分支,*二級提交分支

         父分支是本地的提交分支,開發者在本地做的開發先提交到父分支上,保證本地父分支無衝突(提交歷史爲一條直線),然後再把父分支提交到服務器正本分支上

【4】子分支,*開發分支,解決衝突

         子分支用來做開發或者bug修改,子分支和本地副本分支配合,通過rebase命令,實現無衝突的提交,子分支的修改要通過父分支提交到正本分支上

—————————————————————————————————————————————————————————————————————————————————————————————————————————————

第四部分:提交流程(五個步驟 + 衝突解決)

 

1、(子分支)git fetch

       將遠端正本分支的最新代碼同步到本地副本分支上來

 

2、(子分支)git rebase origin/父分支

       將子分支和本地副本分支無衝突合併

3、(子分支)git checkout 父分支

       切換到父分支

4、(父分支)git merge 子分支

        將父分支和子分支無衝突合併,父分支上獲得子分支和遠端正本分支的最新修改

5、(父分支)git push

        將父分支上子分支的最新修改提交給遠端正本分支

       

  衝突解決:

正常情況下,會在以上步驟中的2、5兩步發生衝突:

(子分支)git rebase origin/父分支衝突:

        協商解決衝突,解決完衝突之後執行:

        git add .  把當前解決完衝突的文件添加至提交緩存

        git rebase --continue  繼續執行未執行完畢的rebase命令

(父分支)git push衝突:

        返回子分支,重新執行一遍1-5五個步驟,並在步驟2解決衝突

—————————————————————————————————————————————————————————————————————————————————————————————————————————————

第五部分:git rebase 命令的原理解釋:(參考http://gitbook.liuhui998.com/4_2.html

假設你現在基於遠程分支"origin",創建一個叫"mywork"的分支。

$ git checkout -b mywork origin

 

 

現在我們在這個分支做一些修改,然後生成兩個提交(commit).

$ vi file.txt
$ git commit
$ vi otherfile.txt
$ git commit
...

但是與此同時,有些人也在"origin"分支上做了一些修改並且做了提交了. 這就意味着"origin"和"mywork"這兩個分支各自"前進"了,它們之間"分叉"了。

 

在這裏,你可以用"pull"命令把"origin"分支上的修改拉下來並且和你的修改合併; 結果看起來就像一個新的"合併的提交"(merge commit):

 

但是,如果你想讓"mywork"分支歷史看起來像沒有經過任何合併一樣,你也許可以用 git rebase:

$ git checkout mywork
$ git rebase origin

這些命令會把你的"mywork"分支裏的每個提交(commit)取消掉,並且把它們臨時 保存爲補丁(patch)(這些補丁放到".git/rebase"目錄中),然後把"mywork"分支更新 到最新的"origin"分支,最後把保存的這些補丁應用到"mywork"分支上。

 

當'mywork'分支更新之後,它會指向這些新創建的提交(commit),而那些老的提交會被丟棄。 如果運行垃圾收集命令(pruning garbage collection), 這些被丟棄的提交就會刪除. (請查看 git gc)

 

現在我們可以看一下用合併(merge)和用rebase所產生的歷史的區別:

 

在rebase的過程中,也許會出現衝突(conflict). 在這種情況,Git會停止rebase並會讓你去解決 衝突;在解決完衝突後,用"git-add"命令去更新這些內容的索引(index), 然後,你無需執行 git-commit,只要執行:

$ git rebase --continue

這樣git會繼續應用(apply)餘下的補丁。

在任何時候,你可以用--abort參數來終止rebase的行動,並且"mywork" 分支會回到rebase開始前的狀態。

$ git rebase --abort

—————————————————————————————————————————————————————————————————————————————————————————————————————————————

第六部分:嘗試提交

現在有一個給大家嘗試提交的遠端倉庫:https://github.com/zhch1991/TestGitServer.git    這個遠端倉庫即爲:服務器代碼(遠端)正本分支

本地測試步驟:

1、創建一個新文件夾,進入新文件夾中,執行git初始化

mkdir test

cd test

git init

 

2、將遠端倉庫下載到本地

git clone https://github.com/zhch1991/TestGitServer.git

此時,執行ls查看,發現當前文件夾中多了:TestGitServer,這個TestGitServer就是從遠端倉庫上下載的代碼

 

3、進入到文件夾中進行代碼和分支查看

cd TestGitServer

git branch -a  此時應該能在分支列表中查看到分支 :remotes/origin/father,這個分支即爲:服務器代碼(本地)副本分支,*分佈式存儲、遠程跟蹤、協助提交

 

4、根據 服務器代碼(本地)副本分支 創建 父分支

git checkout -b father origin/father

 

git branch -a  此時應該能在分支列表中查看到分支 :father,這個分支即爲父分支

 

5、根據父分支創建子分支

git checkout -b son

 git branch -a  此時應該能在分支列表中查看到分支 :son,這個分支即爲子分支

 

準備工作完成,在子分支上進行修改,然後按照第四部分提交流程提交即可

—————————————————————————————————————————————————————————————————————————————————————————————————————————————

 第七部分:可能出現的問題

mac系統終端上執行git push或 git pull時,可能出現如下問題:

See git-pull(1) for details.

    git pull <remote> <branch> 

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> father

原因是mac上不能根據父分支的分支名直接關聯到遠端同名分支上,遇到這個問題,執行:

 

 git branch --set-upstream-to=origin/father father

之後就可以正常push和pull了


有問題可以加我QQ:278040677,備註CSDN,詳細討論
發佈了57 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章