git reset --hard 是什么
git reset --hard 把分支指针移回指定提交,同时重置暂存区与工作区,让这三者都对齐到同一个位置。未提交的改动会被直接丢弃,而且因为从未进入对象库,没有 reflog 可以找回。它只适合放弃明确的本地实验,或者主动把本地状态对齐远端。
与另外两种模式的区别
--soft 只移动指针,改动全部保留在暂存区;--mixed 移动指针并重置暂存区,改动留在工作区;--hard 三者一起重置。三者的差别就是「改动被丢在哪一层」:前两种都不丢内容,只有 --hard 会真的覆盖文件。
基本信息
| 适用平台 | Linux / macOS / Windows(Git 2.x) |
|---|---|
| 语法 | git reset --hard [<提交>] |
| 影响范围 | HEAD、暂存区与工作区 |
| 找回可能 | 已提交内容可用 reflog,未提交改动无法恢复 |
| 典型场景 | 丢弃本地实验、对齐远端状态 |
| 不涉及 | 未跟踪文件不会被清理 |
典型使用场景
- 丢弃实验:本地试了半天的改法不要了,直接回到干净状态
- 对齐远端:让本地分支强制与远端一致,用于排查环境差异
- 清理误改:把误操作产生的改动整体复位
- 回退提交:撤销最近若干条提交并连带丢弃工作区内容
- 重置基准:在废弃分支上重新开始,把指针挪回某个稳定点
常用示例
常用示例
git status # 先看清将要丢弃什么
git stash list # 确认没有遗忘在栈里的现场
git reset --hard HEAD~1 # 回退一条提交并重置工作区
git reset --hard origin/main # 让本地与远端完全一致
git reflog -5 # 误操作后从这里找回已提交内容三种模式丢什么
| 模式 | 暂存区 | 工作区 |
|---|---|---|
| --soft | 保留 | 保留 |
| --mixed(默认) | 重置 | 保留 |
| --hard | 重置 | 重置 |
执行前先用 git status 与 git stash list 双重确认。正在进行的实验建议先提交到临时分支再重置,否则没有任何找回途径。
--hard 不清理未跟踪文件,需要清理时另用 git clean,并且养成先加 -n 演练的习惯,避免把没纳入版本控制的重要文件一起删掉。