git add 和git commit之后怎么撤销?

在本地执行 git addgit commit 后未推送到远程(git push),撤销操作完全安全(不影响远程 develop 分支),核心根据「是否保留代码修改」选择不同撤销方式,以下是分场景的精准命令:

前提:先查看本地提交记录(找到要回退的基准)

首先执行以下命令,确认要撤销的 commit 信息(重点看 HEAD 指向的最新提交,以及上一个干净的提交 ID):

复制代码
# 查看简洁的提交历史(--oneline 简化输出)
git log --oneline

# 输出示例(假设最近1次是错误提交):
# a1b2c3d (HEAD -> develop) feat: 错误提交的内容  # 要撤销的commit
# 987654e 上一个干净的提交(想回到这个状态)

场景 1:仅撤销 git commit(保留代码修改,回到 git add 前)

需求 :不想保留这次 commit,但代码修改还要(比如提交信息写错、漏改文件),撤销 commit 且取消 git add(修改回到工作区)。

复制代码
# 方式1:默认方式(--mixed,推荐,无需加参数)
git reset 987654e  # 987654e 是「上一个干净的提交ID」(示例)

# 方式2:显式指定 --mixed(效果和上面完全一致,可选)
git reset --mixed 987654e

✅ 效果:

  • 撤销本次 git commit,本地提交记录回到 987654e
  • 撤销本次 git add,所有修改回到「未暂存」状态(工作区);
  • 代码修改完全保留,可重新编辑后再次 git add + git commit

场景 2:撤销 git commit 且保留 git add(仅改提交信息)

需求 :只是提交信息写错,想保留 git add 的状态(修改仍在暂存区),仅撤销 commit 重新提交。

复制代码
git reset --soft 987654e  # 987654e 是上一个干净的提交ID

✅ 效果:

  • 撤销本次 git commit,但 git add 状态保留(修改仍在暂存区);
  • 直接执行 git commit -m "修正后的提交信息" 即可重新提交,无需再次 git add

场景 3:彻底撤销(放弃本次所有代码修改 + 撤销 commit)

需求 :本次修改完全错误,想回到上一个干净的提交,且放弃所有本地修改。⚠️ 注意:此操作会永久删除本次代码修改,谨慎使用!

复制代码
git reset --hard 987654e  # 987654e 是上一个干净的提交ID

✅ 效果:

  • 撤销本次 git commit + 撤销 git add
  • 本地代码强制回滚到 987654e 状态,本次所有修改被删除;
  • 执行后可通过 git status 确认工作区是「干净的」。

补充:仅撤销 git add(未执行 git commit

若只执行了 git add 但还没 git commit,想取消暂存(回到工作区):

复制代码
# 撤销所有已add的文件
git reset

# 撤销指定已add的文件(精准撤销)
git reset 路径/到/文件.cpp

关键说明(避坑)

  1. 所有操作仅针对本地 :未执行 git push 前,远程 develop 分支完全不受影响,放心操作;
  2. 提交 ID 简化写法:无需复制完整的 40 位 ID,前 6-8 位即可(如 987654e);
  3. 恢复误操作:若用 git reset --hard 误删代码,可通过 git reflog 找回(执行 git reflog 找到误删的 commit ID,再 git reset --hard 该ID 即可恢复)。

操作验证(撤销后确认状态)

执行撤销命令后,用以下命令确认是否达到预期:

复制代码
git status
# 预期输出(场景1/2):显示「未暂存的修改」(代码保留,无commit);
# 预期输出(场景3):显示「工作区干净」(无修改、无commit)。
相关推荐
无限进步_7 小时前
【C++】多重继承中的虚表布局分析:D类对象为何有两个虚表?
开发语言·c++·ide·windows·git·算法·visual studio
回家路上绕了弯8 小时前
Git worktree 终极指南:告别分支切换烦恼,实现多分支并行开发
git·后端
日更嵌入式的打工仔9 小时前
Git & TortoiseGit
git
会的越多不会的也就越多10 小时前
Win11 右键菜单优化指南:如何把 Git 功能“提”到一级菜单?
git
rebekk12 小时前
claude工作区与git仓库的关系
linux·git·python
神の愛12 小时前
GIT,可以参数这篇,需要加以理解,文字比较冗余,还请见谅
git
jolimark13 小时前
Windows下如何用GCC编译C语言?轻便方法分享
c语言·windows·git·mingw·gcc编译器
△曉風殘月〆13 小时前
一文带你掌握Visual Studio中集成的git功能
git·visual studio
不爱吃糖的程序媛14 小时前
鸿蒙三方库适配读懂 `thirdparty/AES/.gitignore`:哪些文件不该进 Git?
git·elasticsearch·harmonyos
天若有情6731 天前
【C++原创开源】formort.h:一行头文件,实现比JS模板字符串更爽的链式拼接+响应式变量
开发语言·javascript·c++·git·github·开源项目·模版字符串