git之我add错了代码怎么办呀!我commit错了怎么办呀!

虽然错过的人无法挽回,但是git提错的代码却可以撤销。

我 add 错误文件了,怎么办?

这个就比较简单了,执行

perl 复制代码
git reset

该命令的作用是:

  • 撤销暂存 :所有已经 git add 的文件会变成未暂存状态。

  • 保留工作区的修改:文件内容保持不变,仍然在工作区。你可以继续提交文件或者做一些修改之后再提交文件。

我不但 add 了还 commit 了,怎么办?

只能说你还没推送,还行!!! 其实也不难,执行一下

css 复制代码
git reset --mixed HEAD~1

其中的HEAD~1是将 HEAD(当前分支的最新提交)回退到 前一个提交 (HEAD~1 表示"当前提交的前一个")。

如果你做了两次commit操作(还没有push),HEAD~2即可以回退这两次提交。

该命令的作用是

  • 保留工作区内容 :文件内容不会丢失,工作区的文件仍然保留,而且它们变成了未暂存的状态。

  • 撤销暂存区的内容:当前提交中所有已暂存的内容会被从暂存区移除,但仍然保留在工作区。

对比一下这两个命令

命令 作用 提交历史变化 文件变化(工作区和暂存区)
git reset --mixed HEAD 什么都不做,撤回暂存区的更改(撤回add) 不变 暂存区的文件被撤回到工作区,变成未暂存状态
git reset --mixed HEAD~1 回退到前一个提交,撤销最近的提交(撤回commit) 提交历史回退 暂存区和工作区的文件被保留,变成未暂存状态

我不但 add 了,还 commit 了,还push了,怎么办?

好好好,只能说干的漂亮。来瞅瞅怎么办吧!

第一种方案:撤销最近的提交(并强制推送)

如果你想撤销 最近的提交,并且不保留该提交的修改(也就是说你代码没了,铁子),你可以使用

css 复制代码
git reset --mixed HEAD~1
git reset --soft HEAD~1
git reset --hard HEAD~1

参数介绍:

  • --mixed:将提交的文件恢复到工作区
  • --soft:将提交的文件恢复到暂存区,个人感觉不如mixed
  • --hard:丢弃该次提交的文件的改动,你代码没了(远端还在)

然后强制推送到远程仓库。

操作步骤:

  1. 回退到之前的提交:

    css 复制代码
    根据情况选择要使用的参数
    git reset --hard HEAD~1
    • 这会将你的 HEAD 回退到前一个提交,撤销最近的提交并丢弃(丢弃!丢弃!)修改。
  2. 强制推送到远程仓库:

    css 复制代码
    git push origin <branch-name> --force
    • 使用 --force 强制推送到远程仓库,覆盖远程仓库中的历史提交。
    • 同样也可以使用 HEAD~2回退到前两次提交
    • 如果推送失败,可以看git管理员是否设置禁止强推,因为确实很危险,请看下面注意事项。

注意:

  • 丢失本地修改 :--hard 会丢弃工作区和暂存区的修改,因此所有未提交的改动都会丢失。如果你想保留本地修改,可以使用 git reset --mixed 或 git reset --soft。
  • 强制推送 :--force 会重写远程仓库历史,如果有其他人拉取过该提交,强制推送可能导致冲突或丢失其他人的工作,因此确保与团队成员沟通。也就是说如果团队其他成员已经拉取了你的提交,那么该成员的本地分支依然有你撤销的那次提交,此时该成员要是同步代码。就会将你已经撤销的提交再次推送到远端。所以需要团队成员执行如下命令(如果其他成员没有在该分支操作,也可以删除本地分支,重新拉取远端分支)
bash 复制代码
git reset --hard origin/your-branch

第二种方案:生成一个新的提交,来撤销某一次提交

git revert 是用来撤销指定提交的命令,和 git reset 不同,git revert 不会修改历史,而是会生成一个新的提交,用于撤销指定提交的更改。因为它不会改变历史记录,而是通过创建一个新的提交来撤销之前的更改。

css 复制代码
git revert --no-edit <commit-id>
  • <commit-id> :要撤销的提交的哈希值(commit hash)。

  • 可以通过 git log 获取提交的 commit-id。

  • --no-edit:跳过编辑提交信息的步骤(commit),自动使用默认的撤销提交信息(一般使用这个)。

  • -n 或 --no-commit:执行撤销操作,但不会自动提交。你可以在撤销操作之后,修改文件或暂存区,然后手动提交。

  • --continue :如果在执行 git revert 时发生冲突,可以手动解决冲突后,使用 git revert --continue 来继续撤销操作。

  • --edit :在创建撤销提交时,允许你编辑提交信息。默认情况下, Git 会生成一个类似于 Revert "commit message" 的提交信息,并打开你设置的默认文本编辑器(如 Vim、Nano、VSCode 等)来修改这个提交信息。

小小拙见,欢迎大家指正错误。

相关推荐
小凯在掘金12 小时前
为什么箭头函数不能作为构造函数?
前端·javascript
ShineWinsu12 小时前
对于Redis:string类型的解析
java·c++·redis·分布式·缓存·面试·string
JustHappy13 小时前
「vConsole MCP🛠️」我让 AI 直接看见任何 H5 的日志和请求帮你 debug
前端·javascript·程序员
codeGoogle13 小时前
Vue3 UIKit 实战:把聊天、会话、主题和移动端适配全部封装好
前端
大龄秃头程序员14 小时前
iOS Method Swizzling 的工程化实践:如何处理多重交换与第三方冲突
前端
liangshanbo121514 小时前
Webpack 文件指纹面试题整理
前端·webpack·node.js
xieter14 小时前
【技术精选】Node.js 核心事件循环机制与异步 I/O 深度剖析 (2026-10-02)
前端·javascript
计算机魔术师14 小时前
Ethan Mollick 谈点与群:智能体自组织为何让管理假设失效
前端
JAVA面经实录91715 小时前
Java高级后端 · 全套面试通关手册(MySQL)
java·mysql·面试
故七月15 小时前
GEO 信源评估体系:如何判断一条网页信源能否被大模型采信
前端·网络·人工智能