前2天羣裏發了張git歷史圖,以下:html
根據提交歷史,能夠看出圖中全部分支合併都採用merge的方式,具體merge是怎麼操做的,能夠閱讀下邊文章。git
根據項目上的需求,若是要求git提交歷史是比較簡單的一條時間線,可使用rebase的合併;若是沒有這個要求,可使用merge合併,其分支樹是網狀結構,但每一個提交也都是比較明確清晰的。他們的區別,可參考git merge與 git rebase區別及實例:api
(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合併也可能存在衝突,解決衝突與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操做,最終分支樹以下:
轉載請註明出處,謝謝