Git 的強大在於「幾乎任何操作都能撤銷」。本文針對六大常見情境——公開提交回滾、修正訊息、丟棄未暫存修改、重置本地提交、誤重置後復原、分支錯誤修正——提供最佳實務指令與原理解析,並附贈 reflog 救命技與互動式 rebase 大量整理技巧。
git revert <SHA>
git push,適合共享分支。git commit --amend -m "Fixes bug #42"
git checkout -- <filename>
# 或 Git 2.23+
git restore <filename>
git diff 確認。# 保留修改在工作目錄(軟重置)
git reset <last-good-SHA>
# 連同修改一起丟棄(硬重置,慎用)
git reset --hard <last-good-SHA>
--hard 會清空暫存區與工作目錄修改,資料無法透過 Git 復原。git reflog
# 找到誤刪前的 SHA,例如 a1b2c3d
# 完整恢復歷史與工作目錄
git reset --hard a1b2c3d
# 或只恢復特定檔案
git checkout a1b2c3d -- path/to/file
# 或挑選單一提交重新套用
git cherry-pick a1b2c3d
reflog 關鍵特性:
gc.reflogExpire)。# 1. 在當前位置建立 feature 分支(指向最新提交)
git branch feature
# 2. 將 master 硬重置回遠端狀態
git reset --hard origin/master
# 3. 切換到 feature 繼續工作
git checkout feature
此法保留提交歷史於 feature 分支,master 保持乾淨。
git checkout feature
git rebase master
git rebase -i <earlier-SHA>
編輯器開啟列表,每行開頭關鍵字:
pick:保留drop:刪除squash / fixup:合併至上一提交(fixup 捨棄訊息)reword:修改訊息edit:暫停修改內容存檔離開後依序處理衝突或編輯訊息,完成後歷史即重寫完畢。
| 情境 | 指令 | 是否改歷史 | 適用階段 |
|---|---|---|---|
| 公開提交回滾 | git revert <SHA> | 否 | 已推送 |
| 修正最後訊息 | git commit --amend | 是 | 未推送 |
| 丟棄未暫存修改 | git checkout -- <file> | 否 | 隨時 |
| 重置本地提交 | git reset [--hard] <SHA> | 是 | 未推送 |
| 誤重置復原 | git reflog + reset/checkout/cherry-pick | 視操作 | 本地 |
| 分支錯誤修正 | git branch feature; git reset --hard origin/master; git checkout feature | 是 | 未推送 |
| 整理提交歷史 | git rebase -i <SHA> | 是 | 未推送 |



熟練這些撤銷技巧,就能在 Git 世界裡大膽實驗、快速試錯,不再害怕「手滑」。