核心是根据你的 当前操作状态 选择对应命令(不同场景命令不同,选错可能丢代码!)。先教你判断自己的场景,再分步骤操作,最后补充避坑提醒。
第一步:先判断你的「当前状态」(关键!)
执行以下命令,查看文件处于哪个阶段,再对应找方法:
git status
根据输出结果,匹配你的场景:
| 场景描述 | git status 输出特征 | 核心操作 |
|---|---|---|
本文介绍了根据当前 Git 状态(工作区修改、已暂存、本地提交、远程推送)执行恢复操作的四种场景及对应命令。重点区分了 git restore、git reset 和 git revert 的使用时机,强调回滚前备份及协作时的安全操作,避免代码丢失或历史冲突。
核心是根据你的 当前操作状态 选择对应命令(不同场景命令不同,选错可能丢代码!)。先教你判断自己的场景,再分步骤操作,最后补充避坑提醒。
执行以下命令,查看文件处于哪个阶段,再对应找方法:
git status
根据输出结果,匹配你的场景:
| 场景描述 | git status 输出特征 | 核心操作 |
|---|---|---|
场景 1:修改了文件,但没执行 git add(仅工作区修改) |
提示 modified: 文件名,且无 Changes to be committed |
| 直接丢弃工作区修改 |
场景 2:执行了 git add(已暂存),但没 git commit | 提示 Changes to be committed + modified: 文件名 | 先取消暂存,再丢弃修改 |
场景 3:已执行 git commit(本地仓库有新提交),想回滚到上一次 commit | 提示 nothing to commit, working tree clean | 回滚本地提交记录 |
场景 4:已 git push 到远程仓库(远程也有新提交),想回滚 | 远程仓库有对应的新提交记录 | 安全撤销远程提交(不删历史) |
git add)—— 直接丢弃修改适合:改了文件但不想保留,想恢复到上一次 commit 的状态。
# 方法 1:Git 2.23 及以上版本(推荐,语法更清晰)
git restore 文件名 # 恢复单个文件,如 git restore src/App.vue
git restore . # 恢复所有修改的文件(谨慎!会丢弃所有未 add 的修改)
# 方法 2:兼容旧版本 Git(效果同上)
git checkout -- 文件名 # 如 git checkout -- src/App.vue
git checkout -- . # 恢复所有文件
✅ 效果:工作区文件直接回到上一次 commit 的状态,未 add 的修改全部丢弃(无法恢复,确认后再执行)。
git add 暂存(没 git commit)—— 先取消暂存,再恢复适合:不小心把不想提交的文件 git add 了,想撤销暂存并恢复到上一次 commit。
# 步骤 1:取消暂存(将文件从暂存区放回工作区)
# Git 2.23+ 推荐:
git restore --staged 文件名 # 单个文件,如 git restore --staged src/App.vue
git restore --staged . # 所有文件
# 旧版本 Git:
git reset HEAD 文件名 # 单个文件
git reset HEAD . # 所有文件
# 步骤 2:丢弃工作区修改(回到上一次 commit 状态)
git restore 文件名 # 或 git checkout -- 文件名
✅ 效果:暂存区清空,文件恢复到上一次 commit 的状态。
git commit(本地仓库)—— 回滚到上一次 commit适合:已经提交了代码(git commit),但想撤销这个提交,回到上一个版本(未推送到远程仓库)。
有两种方式,根据是否保留当前修改选择:
适合:想撤销提交,但想保留修改的代码(比如提交信息写错了,想重新提交)。
# HEAD~1 表示「上一次提交」,HEAD~2 表示上上次(按需调整)
git reset --soft HEAD~1
✅ 效果:
git status 查看);git commit。适合:确定最新的 commit 完全没用,想彻底删除该 commit 及对应的修改。
git reset --hard HEAD~1
⚠️ 警告:会直接删除最新的 commit 记录和对应的代码修改,无法恢复!执行前建议先备份代码。
git push 到远程仓库(远程仓库)—— 安全撤销远程提交适合:已经推送到远程仓库了,但想恢复到上一个版本(多人协作场景慎用!)。
❌ 绝对禁止:用 git reset --hard HEAD~1 后再 git push --force(会覆盖远程历史,导致协作同事的代码冲突)。
✅ 正确做法:用 git revert 创建「撤销提交」,保留历史记录。
# 1. 创建撤销提交(撤销上一次 commit,生成新的 commit 记录)
git revert HEAD~1 # 撤销上一次提交(HEAD~1)
# 执行后会弹出编辑器,让你填写撤销提交的信息,直接保存退出即可。
# 2. 推送撤销提交到远程仓库(同步远程仓库)
git push origin master # 或 main,根据你的分支名
✅ 效果:
执行以下命令,确认恢复到目标版本:
# 查看提交记录(确认最新的 commit 是上一次的)
git log --oneline # 简洁显示,最新的 commit 在最上面
# 查看工作区状态(确认无未提交的修改)
git status # 理想输出:nothing to commit, working tree clean
git push --force:强行覆盖远程历史会导致同事的代码冲突,甚至丢失他人提交;git status 判断状态,再选命令,别盲目执行 git reset --hard;忘记上一次 commit 是什么?用 git log --oneline 查看,前 7 位字符串是版本号(如 a1b2c3d),也可以用版本号回滚:
git reset --soft a1b2c3d # 回滚到指定版本(保留修改)
git reset --hard a1b2c3d # 回滚到指定版本(丢弃修改)
| 需求 | 命令 |
|---|---|
| 丢弃未 add 的单个文件修改 | git restore 文件名 / git checkout -- 文件名 |
| 取消暂存单个文件 | git restore --staged 文件名 / git reset HEAD 文件名 |
| 本地回滚上一次 commit(保留修改) | git reset --soft HEAD~1 |
| 本地回滚上一次 commit(丢弃修改) | git reset --hard HEAD~1 |
| 远程回滚上一次 push(安全) | git revert HEAD~1 && git push origin 分支名 |

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online