Eclipse裡git提交衝突rejected – non-fast-forward
Eclipse裡commit程式碼,其實只是提交到本地倉庫,需要push才會提交到遠端的git倉庫,這時是一個本地倉庫到遠端倉庫的同步過程。Git是分散式的,每個人在本地倉庫維護本地的自己的那一份程式碼,commit時只提交到本地倉庫,不會影響到別人。當你push到遠端倉庫就可能發生衝突了。假如別人在你push前也push了同一個檔案,那麼問題就來了,衝突了,rejected – non-fast-forward出現了。
解決方法一:每次本地修改程式碼前先從git倉庫pull下想要提交的分支的最新程式碼,改完了commit並push到git倉庫。這裡有個前提,修改、commit和push期間沒人動你修改的檔案。
解決方法二:期間檔案在git倉庫被改了,那麼重新從git倉庫獲取最新的分支程式碼,然後把自己的修改放上去提交。
解決方法三:通過merge來解決衝突。當出現rejected – non-fast-forward別慌,這時我們可以識別哪些檔案有衝突,一個一個改,改好了再pull下最新程式碼,然後提交到遠端倉庫。
下面具體說明下提交操作:
1、單個檔案提交:首先跟遠端倉庫做比較,右鍵修改的檔案和目錄->Team->Synchronized Workspace->確保沒有衝突後再次右鍵修改的檔案和目錄->commit,在Git Staging裡選中Unstaged Changes窗口裡要提交的檔案->Add to Index->在Commit Messge裡寫提交說明->Commit and Push->Next,注意這裡不要選最下面的Force overwirte branch in remote if exists and have deverged,否則本地倉庫會覆蓋遠端倉庫,造成覆蓋別人程式碼的嚴重後果->OK
2、衝突解決:上面在Synchronized Workspace後出現衝突會有鮮豔的紅色箭頭出現,雙擊就可以看到哪個地方衝突了,一般是先把本地的改動儲存好,從遠端取下最新內容,再加上本地修改,最後提交。圖示如下:
上面本地檔案改動了,遠端檔案新增了,所以衝突了,右鍵選中該檔案,點選Merge:
可以看到新怎的那一條自動複製到本地來了,接著右鍵點選Commit,輸入提交說明,提交到本地倉庫。此時再Pull最新遠端git倉庫裡的程式碼到本地倉庫(衝突不解決Pull會報錯,Push報rejected – non-fast-forward),然後Push即可:
注意不要點強推,很容易覆蓋程式碼。