核心是根据你的 当前操作状态 选择对应命令(不同场景命令不同,选错可能丢代码!)。先教你判断自己的场景,再分步骤操作,最后补充避坑提醒。
第一步:先判断你的「当前状态」(关键!)
执行以下命令,查看文件处于哪个阶段,再对应找方法:
bash
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 到 Gitee(远程也有新提交),想回滚 |
远程仓库有对应的新提交记录 | 安全撤销远程提交(不删历史) |
第二步:分场景执行恢复操作(安全优先)
场景1:仅工作区修改(没 git add)------ 直接丢弃修改
适合:改了文件但不想保留,想恢复到上一次 commit 的状态。
bash
# 方法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 的修改全部丢弃(无法恢复,确认后再执行)。
场景2:已 git add 暂存(没 git commit)------ 先取消暂存,再恢复
适合:不小心把不想提交的文件 git add 了,想撤销暂存并恢复到上一次 commit。
bash
# 步骤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 的状态。
场景3:已 git commit(本地仓库)------ 回滚到上一次 commit
适合:已经提交了代码(git commit),但想撤销这个提交,回到上一个版本(未推送到 Gitee)。
有两种方式,根据是否保留当前修改选择:
方式A:保留当前修改(推荐,安全不丢代码)
适合:想撤销提交,但想保留修改的代码(比如提交信息写错了,想重新提交)。
bash
# HEAD~1 表示「上一次提交」,HEAD~2 表示上上次(按需调整)
git reset --soft HEAD~1
✅ 效果:
- 本地提交记录会删除最新的一次 commit;
- 之前 commit 的代码会回到「暂存区」(可通过
git status查看); - 代码本身不会丢失,可修改后重新
git commit。
方式B:彻底丢弃修改(谨慎!不可恢复)
适合:确定最新的 commit 完全没用,想彻底删除该 commit 及对应的修改。
bash
git reset --hard HEAD~1
⚠️ 警告:会直接删除最新的 commit 记录和对应的代码修改,无法恢复!执行前建议先备份代码。
场景4:已 git push 到 Gitee(远程仓库)------ 安全撤销远程提交
适合:已经推送到 Gitee 了,但想恢复到上一个版本(多人协作场景慎用!)。
❌ 绝对禁止:用 git reset --hard HEAD~1 后再 git push --force(会覆盖远程历史,导致协作同事的代码冲突)。
✅ 正确做法:用 git revert 创建「撤销提交」,保留历史记录。
bash
# 1. 创建撤销提交(撤销上一次 commit,生成新的 commit 记录)
git revert HEAD~1 # 撤销上一次提交(HEAD~1)
# 执行后会弹出编辑器,让你填写撤销提交的信息,直接保存退出即可。
# 2. 推送撤销提交到 Gitee(同步远程仓库)
git push origin master # 或 main,根据你的分支名
✅ 效果:
- 远程仓库会新增一个「Revert "上一次的提交信息"」的 commit;
- 代码会恢复到上一次的状态;
- 不会删除任何历史记录,多人协作时不会影响他人,是最安全的远程回滚方式。
第三步:验证是否恢复成功
执行以下命令,确认恢复到目标版本:
bash
# 查看提交记录(确认最新的 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),也可以用版本号回滚:bashgit 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 分支名 |
按上面的步骤,根据你的场景选择命令,就能安全恢复到上一次的版本啦!如果执行中遇到报错(比如版本号不对、分支不匹配),可以告诉我具体报错信息,帮你调整命令。