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

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

相关推荐
发现一只大呆瓜22 分钟前
虚拟列表:支持“向上加载”的历史消息(Vue 3 & React 双版本)
前端·javascript·面试
css趣多多38 分钟前
ctx 上下文对象控制新增 / 编辑表单显示隐藏的逻辑
前端
_codemonster1 小时前
Vue的三种使用方式对比
前端·javascript·vue.js
寻找奶酪的mouse1 小时前
30岁技术人对职业和生活的思考
前端·后端·年终总结
梦想很大很大1 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
We་ct1 小时前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
张3蜂1 小时前
深入理解 Python 的 frozenset:为什么要有“不可变集合”?
前端·python·spring
无小道1 小时前
Qt——事件简单介绍
开发语言·前端·qt
广州华水科技1 小时前
GNSS与单北斗变形监测技术的应用现状分析与未来发展方向
前端
code_YuJun1 小时前
corepack 作用
前端