2018年1月24日 星期三

Git - error : Your local changes to the following files would be overwritten by merge

  • error message         
         ================================================================
          error: Your local changes to the following files would be overwritten by merge:
                     project/code.c
          Please, commit your changes or stash them before you can merge.
          Aborting
         ================================================================

  • explain
    • git pull 後如果出現上面的error 訊息,
      表示 local 端的 code.c 的跟 remote 端的程式有衝突,
      也就是說已經有人跟你一樣改到 code.c 的同一段程式,
      而且比你早把程式放到 server 上

  • solution
    • 大部分在開始改程式之前,
      都會建議先將 remote 端的程式 pull 下來,
      這樣可以減少類似的問題發生,
      但是如果在你 pull remote 端的程式後,
      有其他人又 push 新的程式上去,
      就可以依照下列的步驟處理
    • Step 1
      • git checkout -b new_branch
        • 先 checkout 到新的 branch, new_branch 可以看到修改過的檔案
    • Step 2
      • git add , git commit
        • 在 new_branch 將修改過的程式做 git add 和 git commit 放到 repository,可以用 git log --stat 或是 gitk 檢查最新的 commit
          是不是都包含自己修改過的所有檔案,
          如果沒有的話, 在將漏掉的檔案做 git add 和 git commit
    • Step 3
      • git checkout original_branch
        • 確定修改過的所有檔案在 new_branch 都已經 commit 後,
          再將 branch checkout 到原來的 original_branch
    • Step 4
      • git reset --hard
        • 把之前修改過的檔案全部刪掉,
          在刪掉之前請再確認一次是不是有把所有修改過的檔案備份在新的 new_branch,在 git reset --hard 之前, 確認現在的 branch 是不是 original_branch
    • Step 5
      • git pull
        • 再重新將 remote 端的程式 pull 到 local 端
    • Step 6
      • git log new_branch
        • 先用 git log new_branch 看剛剛在 new_branch commit 的 hash 號碼,
          並複製這串 hash 號碼, 假設看到 commit hash 號碼是 123456
    • Step 7
      • git cherry-pick --no-commit 123456
        • 在 original_branch 做 git cherry-pick,
          把剛剛在 new_branch 的檔案移到 original_branch,
          加上 --no-commit 是爲了讓 git cherry-pick 的檔案不要自動 commit,
          等確定檔案內容都沒有錯之後再做 git commit
    • Step 8
      • git add ,  git commit
        • 將確定沒有問題的檔案做 git add 和 git commit
    • Step 9
      • git push
        • 將新加的 commit push 到 remote 端

沒有留言:

張貼留言