相信有在使用 Git 的各位一定或多或少聽過 Git 的一項好用功能 - stash,中文又稱儲藏,主要是在手邊有臨時工作時用來暫存檔案用的,詳細使用情境可以點這裡 參考。

當 stash pop 遇到 conflict 時,最簡單的方式就是手動改程式碼並 commit 解決。但問題來了,若在stash裡的是尚未完成的程式碼,這個解決 conflict 的 commit 是不是就顯得多餘?這篇文章就是要解決這個麻煩的情況。

首先我們照正常解決 conflict 的流程

  1. 看有哪些 conflict 的檔案,並把這些檔案的內容改成你要的樣子
  2. commit 這些變更(建議訊息寫 WIP,因為之後我們不要這個 commit 了)

至此,你應該已經解決了你的 conflict,但是 log 上卻多了一個無用的、只是為了解決 conflict 的 commit。這時候下以下指令:

$ git reset HEAD^

這樣就可以無用的 commit 給去掉,並且成功地解決了 conflict。現在你的 git status 應該會跟你 stash push 前的狀態一樣

原理

git reset HEAD^僅會還原 commit、並不會把程式碼退到上一個版本。我們就是利用這個特性來達成解決conflict但不增加一個commit的目的

參考資料