✅ 目标
撤销本地已提交但未推送的合并提交(如 git merge 或 git pull 引入的 commit),同时完整保留你未提交的本地测试代码。
🔧 操作步骤
1. 本地先备份(保护你的测试代码,可选)
git stash push --include-untracked -m "backup for local test changes"
✅ 作用:
- 保存所有 已修改但未 add 的 tracked 文件
- 保存所有 untracked 文件(比如你新建的
application.properties)- 避免后续操作意外覆盖你的测试内容
2. git status 查看有几个待提交的 commit
其实 git status 不会显示“有几个待提交的 commit” —— 它只显示工作区和暂存区状态。
✅ 正确做法是用:
git log --oneline -10
或
git status
看这行提示:
Your branch is ahead of 'origin/main' by 7 commits.
→ 这里的 7 就是你本地有 7 个未推送的提交。
📌 确认你要回退的数量 N(比如 N=4 或 N=7)
3. 回退提交历史(不丢工作区)
git reset --soft HEAD~N
🔁 把
N替换成你上一步确认的数字,例如:git reset --soft HEAD~4
✅
--soft的效果:
- 删除最近 N 个提交(从历史中移除)
- 保留工作区和暂存区的所有内容不变(所以你的代码还在)
⚠️ 注意:
~必须是 英文波浪号(不是中文~)
4. 清空暂存区(丢弃合并带来的变更)
git restore --staged .
或兼容旧版 Git 的写法:
git reset
✅ 作用:
- 把上一步因
--soft而留在暂存区的“合并代码”全部取消暂存- 工作区文件不受影响(你的测试代码依然在)
5. 恢复你的本地测试代码
git stash pop
✅ 自动恢复你在第 1 步保存的所有本地修改(包括 untracked 文件)
- 如果有冲突,Git 会提示,但一般不会发生
🎯 最终结果
- ✅ 那 N 个合并提交已从本地历史中消失
- ✅ 你的未提交测试代码完整保留
- ✅ 没有推送任何不需要的内容到远程
- ✅ 分支状态干净,可重新操作