Git分支合併衝突解決(續)

Git分支合併衝突解決,在使用rebase合併衝突狀況下,若是不當心,執行完add後執行了commit,此時本地倉庫HEAD處於遊離態(即HEAD指向未知的分支),如何解決?html

解決方法 

(1)此時,分支處於 無分支 狀態,建立並切換到新分支(git checkout -b conflict),從而解決HEAD遊離狀態;git

(2)放棄這次rebase操做(git rebase --abort);post

(3)在dev分支上merge新分支,出現衝突(git merge conflict);fetch

(4)衝突修改後提交;ui

(5)刪除新分支,合併到遠程倉庫。url

以上篇文章項目爲例

(1)git1在index.html文件中添加「add 2 by git1」,並提交spa

  

  分支樹以下:3d

  

  

 

(2)git2同時在index.html文件中添加「add 2 by git2」,並提交指針

  

  分支樹以下:htm

  

  

(3)git2從遠程倉庫fetch最新文件,此時狀態以下,dev和origin/dev在不一樣的分支上

  

  

  執行rebase,發生衝突(以前全部操做都是在dev分支)

  

  衝突後,分支切換到dev|REBASE 1/1,其中1/1表示有一個提交的衝突。git status能夠看到dev分支基於origin/dev的最新提交dc6c350進行rebase。

  

   查看分支,發現當前分支爲 (no branch, rebasing dev)

  

  分支樹以下,與origin/dev相同:

  

  

(4)爲驗證HEAD遊離態,git2解決完衝突後,執行提交

  

  

(5)此時,HEAD已處於遊離狀態,分支爲  無分支

  • 建立並切換新分支conflict,解決遊離問題

  

  

  • 丟棄本次rebase操做,分支切回dev

  

  此時dev分支任然爲rebase以前的狀態,以下:

  

  • dev分支merge合併conflict分支(該分支解決已以前的衝突),但因爲dev保持原貌,合併依然會發生衝突

  

  因爲發生衝突,此時分支切換到 dev |MWEGING 。index.html文件以下,說明衝突的在「add 2 by git1」行

  

  • 解決衝突,而後提交,此時自動切換到dev分支

  

  分支樹以下,能夠看到HEAD指向了dev最新提交,origin/dev與遠程倉庫一致,conflict分支指向原來衝突修改的分支:

  

  

  • 刪除conflict分支

  

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

  

   

 

 

 總結

  • 解決HEAD指針遊離態,並將修改合併到開發分支。
  • rebase除了 --continue外,還有 --skip 和 --abort 操做,其中skip會忽略本身的提交,而更新爲遠程倉庫版本;abort會放棄本次合併操做,回到rebase以前的狀態。
  • git reset HEAD <file> ,該命令將文件從暫存區退回到工做區 
相關文章
相關標籤/搜索