撤销未推送的提交用 git reset --soft HEAD~1,仅回退 HEAD 指针,保留暂存区修改;已推送则用 git revert 生成反向提交;误删提交可通过 git reflog 恢复;批量丢弃未提交更改用 git restore .。

撤销未推送的提交:用 git reset --soft HEAD~1 最安全
刚提交完就发现提交信息写错、漏了文件,或想把改动重新组织再提交?这时候别急着删分支,git reset --soft HEAD~1 就是为你准备的“后悔键”。它只把 HEAD 指针挪回上一个提交,所有修改原封不动留在暂存区——你打开 VS Code 的源代码管理面板,会看到所有文件还在 “STAGED CHANGES” 里,点提交按钮前还能改 message、增删文件。
- 适用场景:本地提交后立刻反悔,且
git status显示尚未git push - VS Code 图形化操作:右键提交历史 → “Reset Current Branch to Here” → 选 Soft
- ⚠️ 别误用
--hard:它会直接抹掉工作区改动,连你刚写的三行修复都找不回来
已推送到远程的提交,千万别 reset,要用 git revert
一旦 git push 成功,那条提交就进了团队共享历史。此时如果强行 git reset --hard 再 push --force-with-lease,别人 pull 时就会遇到冲突、丢失协作进度,甚至破坏 CI 流水线。正确做法是让 Git 自己生成一条“反向提交”,精准抵消上一次变更。
- VS Code 操作:在提交历史中右键目标提交 → “Revert Commit”,确认后自动生成新提交
- 命令行等效:运行
git revert HEAD(撤销最新一次),或git revert abc1234(按哈希精确撤销) - 生成的新提交可安全
git push,历史线性清晰,协作者无感
误删提交怎么办?靠 git reflog 找回来
git reset --hard 或关闭终端太快,导致提交“消失”?别慌,Git 默认保留最近 30 天的操作日志,只要没执行 git gc,几乎都能捞回来。
- 先运行
git reflog,你会看到类似abc1234 HEAD@{0}: reset: moving to HEAD~1的记录 - 找到目标提交的哈希(比如
def5678),执行git reset --hard def5678 - VS Code 源代码管理视图会立刻刷新,消失的提交和改动就回来了
- ⚠️ 注意:
reflog是本地日志,不随push同步,也不能跨机器恢复
批量放弃未提交修改:用 Git: Discard All Changes
调试中途改乱了一堆文件,又不想一个个右键“Discard Changes”?VS Code 提供了快捷入口,但得知道它背后干了什么。
- 快捷方式:Ctrl+Shift+P → 输入并选择
Git: Discard All Changes - 等效命令:终端执行
git restore .(推荐)或旧版git checkout -- . - ⚠️ 它只影响“未暂存”的修改;如果文件已在暂存区,得先
git restore --staged .或在 UI 中右键“Unstage Changes” - 不会碰任何已提交的内容,也不影响分支指针,纯粹清理工作区脏状态
最常被忽略的一点:撤销操作前,务必先看一眼 git status 和 git log --oneline -n 5。不是所有“撤销”都叫 reset,也不是所有“撤回”都该用 revert——搞错层级,轻则白忙活,重则丢代码。


















