1. 程式人生 > 實用技巧 >Git bash 衝突處理,找回reset hard已經commit程式碼

Git bash 衝突處理,找回reset hard已經commit程式碼

Git是個好工具,如果不熟的話,真的很令人驚心動魄!
記錄下今天碰到的git問題,一波三折,先是更新程式碼有衝突,只能用git bash處理,然後是程式碼被誤刪,然後找回,這次學到的是真多:

更新分支最新程式碼

$ git pull origin develop_common 
From http://****/product_doc
 * branch            develop_common -> FETCH_HEAD
warning: Cannot merge binary files: ***/***/**/***.xlsx (HEAD vs. 4f64df766c62f5c83a56b222ee23bdd4b3275c64)
warning: Cannot merge binary files: ***/***/**/***.xlsx (HEAD vs. 4f64df766c62f5c83a56b222ee23bdd4b3275c64)
Auto-merging ***/***/**/***.xlsx
CONFLICT (content): Merge conflict in ***/***/**/***.xlsx
Automatic merge failed; fix conflicts and then commit the result.

程式碼有衝突,嗯。。。。
感覺用git bash解決衝突還是比較麻煩的,如果衝突比較少的話,簡單一點的解決方法就是,儲存下本次修改的程式碼,
然後回退到上個版本或者回退到沒有衝突的版本,然後再更新程式碼,讓本地分支程式碼合遠端程式碼保持一致,
然後將本地另存的程式碼對比合併到本地分支上,最後提交就行。

1.處理衝突:回退程式碼

$ git reset --hard HEAD

注意:我此處採用的reset hard回退,這個回退會將本地工作區修改的程式碼回退到指定版本,已經add的也會消失,慎用!!!
因為我本地沒有修改程式碼,沒有add程式碼,而且我已經將上次修改的檔案另存了,所以用這個命令。
git rest --hard HEAD^:回退到上一版;
git rest --hard HEAD^^:回退到倒數第二版;
git rest --hard 3628164:回退到commit id為3628164的版本,commit id 可以根據git log檢視;

2.處理衝突:更新本地分支程式碼到最新

$ git pull origin develop_common

3.處理衝突:將修改程式碼手動合併到本地分支上

就在這一步時,突然發現自己當時只儲存了兩個衝突的檔案,沒有儲存其他修改檔案,。。。。!!藥丸啊!

4.找回程式碼

如果手動修改比較麻煩,再改一遍肯定不現實,已經commit了,不知道能不能被找回,上網找了一頓後,真發現有能恢復到之前版本的方法!:

$ git  reflog  //可以檢視所有分支的所有操作記錄(包括已經被刪除的 commit 記錄和 reset 的操作),神仙操作,一輩子忘不了!

找到之前那次有衝突的提交,進行恢復

git reset --hard HEAD@{5}

恢復了!!!

然後將修改檔案全部取出,重新reset hard Head,pull origin develop_common,再將修改的程式碼放上去,然後提交,ok了

以上處理衝突的方法是應當時情況而定的,對於較多的檔案衝突或提交中有較多修改是比較不合適的,從網上找了下git bash 處理衝突的方法,適用面更廣一些,而且更安全

注意:被reset hard 之後,已經add或者commit過的可以被找回,沒有add過的,就是真的找不回了!!!

參考文件:

  1. 用Git Bash 合併程式碼處理衝突 https://www.jianshu.com/p/0063f1d8565b
  2. git reset --hard後的原生代碼找回(commit和沒有commit但add了兩種情況)https://blog.csdn.net/wangyueshu/article/details/90919019
  3. git reset --hard HEAD https://www.jianshu.com/p/3d6606517c3a