git 代码回滚 reset revert 详解 IDEA操作 4种reset区别

问题描述:

我们用 git 在单人或者多人开发的时候,有时候出现的 错误的提交 ,我们此时 撤销 之前的操作,回退、回滚 到之前的版本,这里总结了 2种方法:reset(删除错误提交) 和 revert(新建提交覆盖)

图解 reset 和 revert 区别

1.reset 删除错误的提交记录

reset :删除错误的提交记录,(用于回滚版本、合并简化多余的提交记录)

例如:回退到 version2

image-20210224115917937

例如:将 HEAD 指针指向 version2 的版本,删除后面的版本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pVehqinK-1614157593066)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224121007.png)]

因为是退回到之前的版本,所以这个需要强制 push :git push origin master:master -f

reset 有 4 中不同的类型,–hard、–soft、–mixed、–keep。上述介绍的是 --hard 强制类型,详情在拓展中了解。

2. revert 创建新的提交记录,覆盖错误版本

revert:以 version2 为基础新建提交记录,覆盖之前的错误的代码,但是错误的提交记录还在。

(用于回滚版本,并保存是哪个傻子提交了错误的代码的记录)

image-20210224123528768

image-20210224122826339

(方式1)git 命令行解决

1. reset

使用 reset 从 version4 回滚到 version2

不同版本的 README.md 文件如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ChhCoVUP-1614157593078)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224154918.png)]

1.1.查看提交记录

GitHub 查看提交记录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QrW9nEcV-1614157593080)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224140620.png)]

本地提交记录

git log

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qf4UydgL-1614157593081)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224140057.png)]

1.2 reset 回滚到 version2

de9cf03fb023a8ae6f294b31ae3f7ebfd6c0e0ad 是 version2 的版本号)

git reset --hard de9cf03fb023a8ae6f294b31ae3f7ebfd6c0e0ad
1.3 强制 push
git push origin master:master -f

GitHub 查看提交记录,目标版本之后的提交全部消失了

image-20210224140715505

本地查看提交记录,目标版本之后的提交全部消失了

git log

image-20210224140323508

2. revert

git revert 是建立新的提交,覆盖错误的版本,会记录下是那个傻子提交了错误的代码

目标:从 version4 回滚到 version2

2.1 查看目前版本

GitHub 查看
image-20210224141551817

本地查看

git log

image-20210224141652718

2.2 git revert 回滚
git revert -n de9cf03fb023a8ae6f294b31ae3f7ebfd6c0e0ad^..HEAD
  1. -n 是代表不自动提交,只是将回滚的代码添加到,暂存区(效果类似 git add),因为 revert 默认是回滚一个版本,如果自动提交,最后的代码会变成 verson1 – version2 – version3 – version4 – revert-to-version3 – revert-to-version2 会生成2个commit 记录,所以,一般都要使用 -n(也写作 --no-commit) 这个参数,更多信息可以参考文章后面的拓展链接

  2. HEAD 代表的是目前的状态缩写代表,同理于 298241a046a3781c73c169c933f5539e0e198351

  3. ^.. 代表是范围 revert ,因为 revert 是一个一个 revert 的,格式是 OLD_COMMIT_ID^…NEW_COMMIT_ID ,旧的提交记录在前面

理解 revert 多个提交

(没有输出就是成功,如果出现异常可以看看下面的问题和解决)

查看:

(1)查看文件,本地文件已经回滚到了 version2

image-20210224154519260

2.3 提交文件
git commit -m "revert-to-version"
git push origin master:master

查看:

本地查看

git log

image-20210224155310141

查看 GitHub

image-20210224155522110

(方式2)IDEA 界面操作

其实 IDEA 这种图形化操作其实更方便,请确保你安装 Git 插件,

下面的操作都是将 version4 的版本回滚到 version2

image-20210224155742910

1. reset

1.1 Alt + 9 查看 git Log

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kcX8yLZ0-1614157593093)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224160231.png)]

1.2 reset 回滚到 version2

右键单击 version2 记录,然后选择 Reset Current Branch to Here…

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LN5go44m-1614157593094)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224160700.png)]

1.3 选择 Hard 模式

image-20210224160807380

后面拓展会详细讲 4 中模式的区别

1.4 提交

hard 强制 reset 之后的结果如下

image-20210224161139496

强制 push

因为你本地的 git 代码 的版本 version2 低于远程 version4 ,所以普通 push 会失败,这里只有强制 push

Ctrl + Shift + K push代码(也可以右键,选择 Git -> Repostory -> Push )

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pgxtWIHF-1614157593098)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224161931.pn

但是如果你像我一样看到 Force Push 是灰色的,应为IDEA 更新后不支持在 master 分支上 强制 push

来自 StackOverFlow:

As far as issue 85773 is concerned, that option shouldn’t be in the GUI yet (for IDEA 11-12 or 13+).
And it would be disabled when on the master branch.

但是你可使用命令强制 push

git push origin master:master -f

push 结束后在 GitHub 中看看

image-20210224163650761

2. revert

我们回到最初的起点

2.1 Alt + 9 查看 Git Log

在这里插入图片描述

GitHub 的 Commit 提交记录

image-20210224164047181

4.2 revert 重做 version2

右键单击 version2 记录,然后选择 Revert Commit

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l8vRfNNN-1614157593102)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224164202.png)]

4.3 (重点) 选择 merge

选择 MERGE 你的本地的文件才会回到 version2 的版本,ACCEPT YOURS 不会回到之前版本

在这里插入图片描述

image-20210224164522073

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2nADRCJm-1614157593104)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224164612.png)]

在这里插入图片描述

image-20210224170002282

push 代码(因为你的代码的版本是递增的,不会删除已经推送到远程的分支,所以可以普通 push)

快捷键 Ctrl + Shift + K

在这里插入图片描述

查看 GitHub commit 记录

在这里插入图片描述

(拓展) 4 种 git reset 详解

可以参考这篇文章:Git Reset 三种模式 - 简书 (jianshu.com)

Snipaste_2021-02-24_10-30-23

参考:

Git Reset 三种模式 - 简书 (jianshu.com)

(14条消息) Git恢复之前版本的两种方法reset、revert(图文详解)_游笑天涯-CSDN博客_git revert

常见问题和解决

1. git revert 错误

报错信息如下

# git revert -n de9cf03fb023a8ae6f294b31ae3f7ebfd6c0e0ad^..HEAD
README.md: unmerged (ae62d700d653021c24138215ac9f4e791a921b56)
README.md: unmerged (e5a4c368e4b9131d170893a69c8b69bf50438606)
README.md: unmerged (e9582e4fdfa9384de9e52e75c80ee42e5c8cc169)
error: your index file is unmerged.
fatal: revert failed

image-20210224152744761

error: could not revert de9cf03… version2

在这里插入图片描述

  • 23
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
引用中提到,git reset命令可以将操作限制在一个单独的文件中,而git revert命令不能。而引用中给出了一个具体的例子,使用"git reset --hard 目标版本号"命令可以将版本回退到指定的提交。例如,使用"git reset --hard 9feb83df6db8b132004325ab03377b2088cba540"命令可以将版本回退到提交号为9feb83df6db8b132004325ab03377b2088cba540的版本。另外,引用中提到,使用"git reset --keep"命令可以回滚暂存区的全部文件,相当于撤销了之前的git add操作。所以,git reset命令可以回滚到指定的版本或撤销暂存区的修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [GIt版本回滚的两方法reset、revert](https://blog.csdn.net/qq_16221009/article/details/125490631)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Git回滚到指定版本的方法:reset、revert](https://blog.csdn.net/qq_37268201/article/details/123668610)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JarvanStack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值