git的衝突解決–git rebase之abort、continue、skip

 

 

(1)應用實例描述

假設在github或者gitoschina上建立了一個項目,默認分支爲master分支,遠程master分支上c.sh文件內容:
在這裏插入圖片描述
開發者A、B分別將項目拷貝到自己本地進行開發

某一天,開發者B提交c.sh,並且提交成功,
在這裏插入圖片描述
之後,開發者A在本地代碼並沒有和遠程master分支的代碼同步的情況下,對本地的c.sh進行了修改,修改後c.sh內容如下:
在這裏插入圖片描述
修改後,開發者A準備將代碼提交到遠程master分支上。

(2)引入問題

假設開發者A提交過程如下:

$ git add c.sh

$ git commit -m “XXXX”

如果直接使用$ git push,則會報錯:

error: failed to push some refs to ‘[email protected]:XXXX/gitlearning.git’

hint: Updates were rejected because the remote contains work that you do not have locally. This is usually caused by another repository pushing to the same ref. You may want to first integrate the remote changes (e.g., ‘git pull …’) before pushing again. See the ‘Note about fast-forwards’ in ‘git push --help’ for details.

上述過程的節點走向如下圖所示:
在這裏插入圖片描述
實際開發過程中考慮其它開發者可能會對c.sh進行修改,因此一般在開發過程中建議使用

$ git pull --rebase

與遠程代碼同步,同步過程會檢查衝突,
在這裏插入圖片描述
此時,開發者根據 <<<<<<< HEAD,=======,>>>>>>> 便可知衝突的位置。

注意: 不是出現衝突才使用git pull --rebase,它是一種解決衝突的手段,另外還有merge的方式

(3) 知識點引入

$ git pull --rebase

git pull的默認行爲是git fetch + git merge

git pull --rebase則是git fetch + git rebase.

$ git fetch

從遠程獲取最新版本到本地,不會自動合併分支

$ git rebase

git rebase,顧名思義,就是重新定義(re)起點(base)的作用,即重新定義分支的版本庫狀態。本地更新分支節點過程如下圖所示。(關於rebase節點知識點可以參考http://blog.csdn.net/hudashi/article/details/7664631/)
在這裏插入圖片描述
$ git pull --rebase

git pull --rebase執行過程中會將本地當前分支裏的每個提交(commit)取消掉,然後把將本地當前分支更新爲最新的"origin"分支,該過程本地分支節點更新圖如下所示:
在這裏插入圖片描述
(4)回到主題
執行完git pull --rebase之後如果有合併衝突,使用以下三種方式處理這些衝突:

git rebase --abort 會放棄合併,回到rebase操作之前的狀態,之前的提交的不會丟棄;

git rebase --skip 則會將引起衝突的commits丟棄掉(慎用!!);

git rebase --continue 合併衝突,結合"git add 文件"命令一起用與修復衝突,提示開發者,一步一步地有沒有解決衝突。(fix conflicts and then run “git rebase --continue”)

對上述衝突的處理

1、使用 $git rebase --abort

執行之後,本地內容會回到提交之間的狀態,也就是回到以前提交但沒有pull是的狀態,簡單來說就是撤銷rebase。

2、使用 $git rebase --skip

git rebase --skip 引起衝突的commits會被丟棄,對於本文應用的例子來說開發者A對c.sh文件的commit無效,開發者A自己修改的部分全部無效,因此,在使用skip時請慎重。

執行:$ vim c.sh

查看本地c.sh文件提交內容,展示如下圖所示,執行語句之後開發者A的修改無效。
在這裏插入圖片描述
3、使用 $git rebase --continue

執行完$git pull --rebase 之後,本地如果產生衝突,手動解決衝突之後,用"git add"命令去更新這些內容的索引(index),然後只要執行:

$ git rebase --continue 就可以線性的連接本地分支與遠程分支,無誤之後就回退出,回到主分支上。
注意:一般情況下,修改後檢查沒問題,使用rebase continue來合併衝突。

 

因爲開發環境有區別,同事和我安裝的包也有區別,不小心把他的apache4php這個包刪除了,後面線上支付出了問題,後面就有點混亂了,然後今早拉取最新代碼的時候就出現如題那個錯誤,說我的本地和遠程分叉了,我本地還比遠程多4個commit,本想把遠程的拉下來然後手動解決衝突的,發現一拉就報錯,

$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 3 and 4 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)
nothing to commit, working tree clean

根據提示說把遠程拉下來和我本地合併,完全不管用。沒辦法,只能用遠程覆蓋本地的了,命令如下:

注意了,這個操作會覆蓋本地的修改,因此建議手動備份!一定要備份!可以查看一下本地和遠程現在有區別的有哪些文件,針對性的備份。

git fetch origin
git reset --hard origin/master
 ———————————————— 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章