取消 remote 上某個錯誤的 git commit

今天很蠢的把一個很大的檔案 push 到 remote repo 上,經過了一番 commit 後,在 deploy 時才驚覺到這樣以後會造成很大的麻煩(每次 deploy 都會把這個大檔 clone 回來!超慢!),所以決定把 repo reset 回先前的狀態,至於後續的一些 commit,再一筆一筆 apply 回去。

首先,用 git log 找到錯誤 commit 的 SHA-1 Hash,例如這個好了:818645de,然後用 git format-patch 產生從此 commit 以後的 patch 檔案:

git format-patch 818645de

如此會產生一連串 patch 檔案, 例如

0001-Laterals-script-Laterals.patch
0002-Add-a-method-to-get-all-PCU-case-for-spine.patch
0003-sql-sum-count-delta_sum.patch
0004-Add-methods-to-get-PCU-exam-for-Hip-and-Forearm.patch
0005-change-variable-names.patch
0006-Hip-BMD-STD.patch
0007-Forearm-BMD-STD.patch
0008-pid.patch
0009-change-layout-and-use-pagination.patch

接下來找到錯誤 commit 的前一個 SHA-1 Hash,例如 eae85321 好了,以 git reset 回復:

git reset --hard eae85321

這時 HEAD 會回到沒有該錯誤 commit 的狀態,此時便利用 git am 來將這些 patch apply 回去,但要注意的是,第一次要先執行 git am --abort 不然會產生

previous rebase directory xxx/.git/rebase-apply still exists but mbox given.

之類的錯誤訊息。接著把 patch apply 回去即可。

git am *.patch

因為我三不五時就會想把 commit push 到 remote 去,所以這時得用

git push -f origin master

來將 remote 上的資料覆蓋。收工。