git 代码回滚 reset revert 详解 IDEA操作 4种reset区别
我们用 git 在单人或者多人开发的时候,有时候出现的 错误的提交 ,我们此时 撤销 之前的操作,回退、回滚 到之前的版本,这里总结了 2种方法:reset(删除错误提交) 和 revert(新建提交覆盖)
问题描述:
我们用 git 在单人或者多人开发的时候,有时候出现的 错误的提交 ,我们此时 撤销 之前的操作,回退、回滚 到之前的版本,这里总结了 2种方法:reset(删除错误提交) 和 revert(新建提交覆盖)
图解 reset 和 revert 区别
1.reset 删除错误的提交记录
reset :删除错误的提交记录,(用于回滚版本、合并简化多余的提交记录)
例如:回退到 version2

例如:将 HEAD 指针指向 version2 的版本,删除后面的版本
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pVehqinK-1614157593066)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224121007.png)]](https://i-blog.csdnimg.cn/blog_migrate/7e37ba84bbbf10011182f60eb57c0008.png)
因为是退回到之前的版本,所以这个需要强制 push :
git push origin master:master -freset 有 4 中不同的类型,–hard、–soft、–mixed、–keep。上述介绍的是 --hard 强制类型,详情在拓展中了解。
2. revert 创建新的提交记录,覆盖错误版本
revert:以 version2 为基础新建提交记录,覆盖之前的错误的代码,但是错误的提交记录还在。
(用于回滚版本,并保存是哪个傻子提交了错误的代码的记录)


(方式1)git 命令行解决
1. reset
使用 reset 从 version4 回滚到 version2
不同版本的 README.md 文件如下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ChhCoVUP-1614157593078)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224154918.png)]](https://i-blog.csdnimg.cn/blog_migrate/15d0713abcec67d7fbc9b8b73364438f.png)
1.1.查看提交记录
GitHub 查看提交记录
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QrW9nEcV-1614157593080)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224140620.png)]](https://i-blog.csdnimg.cn/blog_migrate/d0bc740a0fcca44450842ccc7ad78356.png)
本地提交记录
git log
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qf4UydgL-1614157593081)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224140057.png)]](https://i-blog.csdnimg.cn/blog_migrate/6c8bd0916df8b1a08c90202734de048f.png)
1.2 reset 回滚到 version2
( de9cf03fb023a8ae6f294b31ae3f7ebfd6c0e0ad 是 version2 的版本号)
git reset --hard de9cf03fb023a8ae6f294b31ae3f7ebfd6c0e0ad
1.3 强制 push
git push origin master:master -f
GitHub 查看提交记录,目标版本之后的提交全部消失了

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

2. revert
git revert 是建立新的提交,覆盖错误的版本,会记录下是那个傻子提交了错误的代码
目标:从 version4 回滚到 version2
2.1 查看目前版本
GitHub 查看
本地查看
git log

2.2 git revert 回滚
git revert -n de9cf03fb023a8ae6f294b31ae3f7ebfd6c0e0ad^..HEAD
-n 是代表不自动提交,只是将回滚的代码添加到,暂存区(效果类似
git add),因为 revert 默认是回滚一个版本,如果自动提交,最后的代码会变成 verson1 – version2 – version3 – version4 – revert-to-version3 – revert-to-version2 会生成2个commit 记录,所以,一般都要使用 -n(也写作 --no-commit) 这个参数,更多信息可以参考文章后面的拓展链接HEAD 代表的是目前的状态缩写代表,同理于
298241a046a3781c73c169c933f5539e0e198351
^..代表是范围 revert ,因为 revert 是一个一个 revert 的,格式是 OLD_COMMIT_ID^…NEW_COMMIT_ID ,旧的提交记录在前面
(没有输出就是成功,如果出现异常可以看看下面的问题和解决)
查看:
(1)查看文件,本地文件已经回滚到了 version2

2.3 提交文件
git commit -m "revert-to-version"
git push origin master:master
查看:
本地查看
git log

查看 GitHub

(方式2)IDEA 界面操作
其实 IDEA 这种图形化操作其实更方便,请确保你安装 Git 插件,
下面的操作都是将 version4 的版本回滚到 version2

1. reset
1.1 Alt + 9 查看 git Log
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kcX8yLZ0-1614157593093)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224160231.png)]](https://i-blog.csdnimg.cn/blog_migrate/45d2611afc0a24e4f0b46e06fdaf26e8.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)]](https://i-blog.csdnimg.cn/blog_migrate/c84248b581dad78395f947bdd02c709d.png)
1.3 选择 Hard 模式

后面拓展会详细讲 4 中模式的区别
1.4 提交
hard 强制 reset 之后的结果如下

强制 push
因为你本地的 git 代码 的版本 version2 低于远程 version4 ,所以普通 push 会失败,这里只有强制 push
Ctrl + Shift + K push代码(也可以右键,选择 Git -> Repostory -> Push )

但是如果你像我一样看到 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 中看看

2. revert
我们回到最初的起点
2.1 Alt + 9 查看 Git Log

GitHub 的 Commit 提交记录

4.2 revert 重做 version2
右键单击 version2 记录,然后选择 Revert Commit
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l8vRfNNN-1614157593102)(https://bmft-img-1304103443.cos.ap-chongqing.myqcloud.com/image/20210224164202.png)]](https://i-blog.csdnimg.cn/blog_migrate/49afc3273008c064d4b7534e50fe0229.png)
4.3 (重点) 选择 merge
选择 MERGE 你的本地的文件才会回到 version2 的版本,ACCEPT YOURS 不会回到之前版本


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


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

查看 GitHub commit 记录

(拓展) 4 种 git reset 详解
可以参考这篇文章:Git Reset 三种模式 - 简书 (jianshu.com)

参考:
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

error: could not revert de9cf03… version2

更多推荐
所有评论(0)