GIT : 記錄IntelliJ IDEA 合併衝突時的一個bug(衝突解決後代碼和本地倉庫一樣時導致merge失敗)
目錄
IntelliJ IDEA版本
IntelliJ IDEA 2017.1.4 x64
問題描述
我們在用git開發是經常遇到衝突的情況,一般發生在協同開發時,一個檔案被兩個人同時改掉了,這是我們在pull程式碼時要解決衝突,並重新add然後commit最後push.
這個部落格記錄一個IntelliJ IDEA在解決衝突的小問題.我們先構造一下衝突
github如下:
本地IDEA如下:
README.md在本地倉庫和github上第三行的資料不一樣,這是如果我們push會提示我們需要先pull(fetch+merge),這裡就不演示這個提示了.我們直接pull
提示我們有衝突,我們選擇merge,在IDEA上解決衝突
注意下邊的這張圖:
我們按照如下方式解決衝突:然後點選apply
解決完衝突我們需要從新add , commit 然後push,但就在這時我們通過windows git bash客戶端用git status -s命令檢視當前狀態時卻發現沒有可以add的程式碼.但是在最後方箭頭位置提示 (master|MERGING)
注:這個MERGING出現在merge開始,消失在commit完成,即merge結束
git bash(純命令列) / linux(centos) 純命令列:哪怕解決完衝突的程式碼和本地倉庫程式碼相同也是需要我們接下add commit的.add前通過git status -s 命令檢視會發現這個檔案前邊狀態為 UU
IDEA處理衝突:如果最終解決完衝突的程式碼和本地倉庫程式碼不同的話這裡是會提示有可以add的內容(status -s檢視狀態為檔案前邊狀態為 UU,和git bash / linux一樣),而解決完衝突的程式碼如果本地倉庫程式碼相同的話如下圖.且此時通過 git diff 和 git diff –cached命令檢視發現工作區,暫存區,本地倉庫程式碼全部一樣.
因為上邊這部我們沒法add,所以我們直接通過IDEA commit.居然提示我們沒有可以commit的程式碼.
這是我們看一下git log ,很顯然還沒有merge完啊.明明我剛才已經解決了衝突了呀,但是merge到一半IDEA撂挑子啦.
如果此時我們試圖將程式碼push到倉庫會出現這個情況:(大意是需要先merge在push,也就是merge一半現在是)
這時我們通過IDEA自帶的git試圖去merge的話會出現錯誤,原因是有一個merge現在正在進行中.如下圖
解決辦法
現在問題定位了,IDEA在merge到一半的時候出問題了.所以接下來的事情只能我們自己解決了.我們先分析一下現在斷在哪裡了,因為剛才通過git diff 和 git diff –cached命令檢視狀態時並沒有發現什麼不同,所以姑且認為add已經完成了.那好我們自己通過命令列commit
出現如下commit資訊(merge產生的),:wq退出,merge成功.
觀察IDEA的git log發現也正常了
還有一種解決思路:就是我們直接把.git/MERGE_HEAD刪掉,這樣進行到一半的merge就被我們幹掉了.這個方法我沒有試驗,有興趣同學可以試試