场景
当我提交了本次修改到本地和远程分支后,发现我本次提交还少了一些修改内容,或者说本次修改是完全错误的,然而也push到远程仓库去了。如何回退?
问题
已经提交到仓库(本地和远程仓库)的内容如何利用IDEA回退到原来指定版本?
方法
有两种方法:1、Revert操作 2、利用IDEA的Reset Head指针
影响
方法1的Revert操作会当成一个新的提交记录,追加到提交日志当中,这样便保留了原来的提交记录。(推荐)
方法2的Reset Head指针,会抛弃原来的提交记录,使Head指针强制指向指定的版本。
实验环境
上图是实验环境。本次实验只操作Readme.md文件。初始化时,master和演示使用的分支“git_demo”都是指向版本一:“版本1:第一次编辑”文本内容。当前操作分支为git_demo。
说明
本次实验环境未必和您的情况完全相符,不过大致思路是相同的。如果您在解决问题过程中遇到冲突,解决就好了。
方法1:Revert操作
当在版本1基础上进行修改内容,并提交本地、远程仓库后,发现提交的内容不是我想要的,或者是完全错误的,需要回退版本1。
![](https://i-blog.csdnimg.cn/blog_migrate/173c1f659edb8a7f578a3c58d15de145.png)
步骤
在想要回退历史版本上单击鼠标右键,选择“Revert”(见下图)
![](https://i-blog.csdnimg.cn/blog_migrate/64005d0e1dfd8617f797ae4f5cb322c4.png)
这时弹出冲突对话框,双击冲突文件以解决冲突。(见下图)
在解决冲突对话框中,决定最终的版本文件。(见下图)
![](https://i-blog.csdnimg.cn/blog_migrate/26dafa97ffcb89cd818d5edd0011ee6b.png)
重新提交到本地仓库(见下图)
Push
同步远程仓库(见下图)
![](https://i-blog.csdnimg.cn/blog_migrate/b7e1b8d67f610b3f0937cc6b9cd17ad1.png)
这种回退的好处在于,如果后悔了“回退”这个操作,也可以回退到没有回退之前的版本。因为历史记录还保留提交记录。
方法2:Reset Head指针
当在版本1基础上进行修改内容,并提交本地、远程仓库后,发现提交的内容不是我想要的,或者是完全错误的,需要回退版本1。
![](https://i-blog.csdnimg.cn/blog_migrate/173c1f659edb8a7f578a3c58d15de145.png)
步骤在想要回退历史版本上单击鼠标右键,选择“Reset Current Branch to Here”(见下图)
![](https://i-blog.csdnimg.cn/blog_migrate/d840b3da2f0aba1ffb8d37d7287cf657.png)
在弹出的git reset 参数类型选择框中,选择Hard(见下图),并Reset
本地仓库回退到了版本1,需要同步远程仓库,执行push操作。
![](https://i-blog.csdnimg.cn/blog_migrate/d520af859f8e710db804135cd5cf4859.png)
push
后,提示Push拒绝。打开Terminal,在本项目目录下,输入git push -f 强制同步远程仓库。
![](https://i-blog.csdnimg.cn/blog_migrate/60c5f16948a984a72fc52e57a5718293.png)
![](https://i-blog.csdnimg.cn/blog_migrate/edf8db36e08d3f5c84955fa2934cf821.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a10caed49241156271aae059b0e246c3.png)
同步后,会发现,git日志丢失了版本1以后的提交。
总结
- Revert操作其实就是回退操作,默认是回退到最近一次提交点,也可以回退到指定提交点,就像本次实验演示的。
- Revert的操作其实也是设置Head指针。
- 其实比较推荐Revert操作,毕竟可以后悔。方法2中git push -f 强制同步操作并不推荐使用,在团队协作环境中可能会引发问题。
- 在方法2中,选择git reset参数选择的是hard,这种参数适合场景是我只想回退到指定版本的文本。工作区里的内容可以放弃,版本2完全放弃。其实也可以选择Mixed。Mixed作用是在设置Head指针时,保留当前工作区里的文本内容。这样方便直接修改,适合于提交的内容有误,只想修正回来就可以了这种情况。(对比效果见下图)
![](https://i-blog.csdnimg.cn/blog_migrate/1d7679a183e9d1691c46b244e4ddcb61.png)
在回退过程中,可能您的情况不会像本实验那么简单,也就是说会出现冲突情况。那么只需要解决冲突即可。
结尾
除了Hard和Mixed选项,其它回退选项的效果演示可以访问这里: Git Reset 模式演示