Git 強大的歷史管理機制讓幾乎所有操作都可撤銷。本文針對六大經典場景(公開提交回滾、修正 Commit 訊息、丟棄本地修改、重設本地提交、Reset 後悔藥、Reflog 找回遺失提交)提供標準指令與原理解析,助您從容應對版控災難。

指令:git revert <SHA>
原理:建立一個新提交,內容與指定提交完全相反(刪除變新增、新增變刪除)。不改寫歷史,可直接 git push,團隊協作首選。
指令:git commit --amend -m "Fixes bug #42"
原理:以新提交取代最近一次提交,若暫存區無新異動則僅修改訊息。會改寫歷史,僅限未推送的本地提交使用。
指令:git checkout -- <filename>
原理:將工作區檔案還原至 HEAD(或指定分支/提交)狀態。修改永久消失,執行前請用 git diff 確認。
軟重設(保留修改在暫存區):git reset <last-good-SHA>
硬重設(連同工作區修改一併丟棄):git reset --hard <last-good-SHA>
原理:將 HEAD 指標移動至指定提交,彷彿後續提交從未發生。--hard 具破壞性,謹慎使用。
指令:git reflog → 找到目標 SHA → git reset --hard <SHA> 或 git checkout <SHA> -- <file>
原理:reflog 記錄 HEAD 所有移動歷史(含 reset、rebase、checkout、commit),是找回「遺失提交」的終極安全網。
git rebase -i HEAD~3
# 編輯器中將目標提交前的 pick 改為 edit/reword/squash
# 依提示操作後 git rebase --continue
警告:Rebase 改寫歷史,嚴禁用於已推送至共享分支的提交。
| 場景 | 指令 | 是否改寫歷史 | 適用階段 |
|---|---|---|---|
| 公開提交回滾 | git revert | 否 | 已推送 |
| 修正最新訊息 | git commit --amend | 是 | 未推送 |
| 丟棄工作區修改 | git checkout -- file | 否 | 未暫存 |
| 移除近期本地提交 | git reset [--hard] | 是 | 未推送 |
| 找回 Reset 遺失提交 | git reflog | 否 | 任何時候 |
| 修改歷史提交內容/訊息 | git rebase -i | 是 | 未推送 |