Git分支合併衝突解決

前2天羣裏發了張git歷史圖,以下:html

根據提交歷史,能夠看出圖中全部分支合併都採用merge的方式,具體merge是怎麼操做的,能夠閱讀下邊文章。git


根據項目上的需求,若是要求git提交歷史是比較簡單的一條時間線,可使用rebase的合併;若是沒有這個要求,可使用merge合併,其分支樹是網狀結構,但每一個提交也都是比較明確清晰的。他們的區別,可參考git merge與 git rebase區別及實例api

  •        rebase合併:本質是先取消本身的提交,臨時保存,而後把當前分支更新到最新的origin分支,最後應用本身的提交。
  •        merge合併:將兩個分支進行合併提交。

 rebase合併

(1)遠程fetch的代碼,本地沒有修改,直接rebase便可;app

(2)若本地對文件修改,沒有add,rebase時,會提示「Cannot rebase: You have unstaged changes.Please commit or stash them.」,add後沒有commit,會提示「Cannot rebase: Your index contains uncommitted changes.Please commit or stash them.」。commit後,若是沒有修改同一文件,rebase不會衝突。post

(3)若本地對同一個文件修改,commit後,rebase時,有2種狀況:fetch

    ① 若是沒有修改同一位置,則能夠rebase,不會產生衝突;ui

    ② 若是修改了同一處,則rebase時會出現衝突,也不用怕,此時git已經進行了合併,只是沒有應用本身的提交,解決辦法:修改衝突的文件,而後執行add和rebase --continue操做便可。若是不當心,執行完add後執行了commit,此時本地倉庫HEAD處於遊離態,如何解決,後續再補充。url

 merge合併

merge合併也可能存在衝突,解決衝突與rebase類似,處理完衝突文件後,從新提交便可。spa

舉例說明

假設如今有3我的(git一、git二、git3)合做開發一個項目。3d

(1)git1建立項目,添加index.html文件,在index文件中添加「create by git1」,提交;

         git2拉取文件後,在index中添加「add by git2」,提交;

         git3拉取文件後,在index中添加「add by git3」,提交;

         git1拉取最新代碼後,在index中添加「add by git1  add1 by git1」,以下:

         

        提交遠程倉庫,分支樹以下:

  

(2)git2在index文件中添加「add 1 by git2」,以實驗衝突

  此時分支樹以下:

  

  

  提交後:

  

  而後執行rebase發生衝突:

  

  分支樹爲(此時分支爲(no branch, rebasing dev)):

  

  

  打開衝突文件,衝突部分是以 <<<<<<<<<< =============  >>>>>>>>>>標識,將此部分代碼進行處理,處理後的文件爲:

  

  執行add和rebase --continue

  

   rebase結束,分支樹爲:

  

  

  提交遠程後,最終分支樹以下:

  

(3)git3的index文件以下:

   

       將index文件中的第一行修改成「create by git1  modifed in another place」,提交。

   

       從遠程拉取最新文件,執行rebase

       

       最終結果以下:

  

  

  

(4)git1建立了一個index2.html文件,提交後push,遠程拒絕push,緣由是本地不是最新版本,須要更新後提交,拉取最新文件。

   

  git1執行merge操做,最終分支樹以下:

  

  

總結

  • 修改同文件不一樣處,rebase和merge合併不會衝突
  • 修改同文件同一處,合併會衝突,解決方式:rebase,解決衝突,執行add+rebase continue;merge,解決衝突,從新提交

 轉載請註明出處,謝謝

相關文章
相關標籤/搜索