接Git分支合並沖突解決,在使用rebase合並沖突情況下,如果不小心,執行完add后執行了commit,此時本地倉庫HEAD處於游離態(即HEAD指向未知的分支),如何解決?
解決方法
(1)此時,分支處於 無分支 狀態,創建並切換到新分支(git checkout -b conflict),從而解決HEAD游離狀態;
(2)放棄此次rebase操作(git rebase --abort);
(3)在dev分支上merge新分支,出現沖突(git merge conflict);
(4)沖突修改后提交;
(5)刪除新分支,合並到遠程倉庫。
以上篇文章項目為例
(1)git1在index.html文件中添加“add 2 by git1”,並提交
分支樹如下:
(2)git2同時在index.html文件中添加“add 2 by git2”,並提交
分支樹如下:
(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> ,該命令將文件從暫存區退回到工作區