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 --mixedgit 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 等)来修改这个提交信息。

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

相关推荐
GIS之路2 分钟前
GDAL 实现矢量裁剪
前端·python·信息可视化
是一个Bug6 分钟前
后端开发者视角的前端开发面试题清单(50道)
前端
Amumu121388 分钟前
React面向组件编程
开发语言·前端·javascript
学历真的很重要8 分钟前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
持续升级打怪中29 分钟前
Vue3 中虚拟滚动与分页加载的实现原理与实践
前端·性能优化
GIS之路33 分钟前
GDAL 实现矢量合并
前端
hxjhnct35 分钟前
React useContext的缺陷
前端·react.js·前端框架
前端 贾公子1 小时前
从入门到实践:前端 Monorepo 工程化实战(4)
前端
菩提小狗1 小时前
Sqlmap双击运行脚本,双击直接打开。
前端·笔记·安全·web安全
前端工作日常1 小时前
我学习到的AG-UI的概念
前端