面试官问:Git 如何撤回已 Push 的代码?
如果问你,你会吗?
在日常的开发中,我们经常使用Git来进行版本控制。有时候,我们可能会不小心将错误的代码 Push 到远程仓库,或者想要在本地回退到之前的某个版本重新开发。
或者像我一样,写了一些感觉以后很有用的优化方案push到线上,又接到了一个新的需求。但是呢,项目比较重要,没有经过测试的方案不能轻易上线,为了承接需求只能先把push上去的优化方案先下掉。
现在我的分支是这样的,我想要在本地和远程仓库中都恢复到
help文档提交
的部分。
“
这样的操作非常不推荐,但是如果你不了解git,确实是我们最容易理解的方式。
如果你的错误代码不是很多,那么你其实可以通过与你想要恢复到的commit进行对比,然后手动删除错误代码,然后删除不同的代码。
“
按住 ctrl 选择想要对比的两个commit,然后选择
Compare Versions
就能通过对比删除掉你想要删除的代码。
这个方案在代码很简单时时非常有效的,甚至还能通过删除后最新commit和想要退回的commit在
Compare
一下保障代码一致。
但是这个方法对于代码比较复杂的情况来说就不太好处理了,如果涉及到繁杂的配置文件,那更是让人头疼。只能通过反复的Compare Version来进行对比。
这样的手动操作显然显得有些笨拙了,对此git有一套较为优雅的操作流程,同样能解决这个问题。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
-
视频教程:https://doc.iocoder.cn/video/
同样的,我第三次提交了错误代码,并且已经push到远程分支。想要撤回这部分代码,只需要
右键点击错误提交记录
git自动产生一个Revert记录,然后我们会看到git自动将我第三次错误提交代码回退了,这个其实就相当于git帮我们手动回退了代码。
后续,只需要我们将本次改动
push到远程,即可完成一次这次回退操作,
“
revert相当于自动帮我们进行版本回退操作,并且留下改动记录,非常安全。这也是评论区各位大佬非常推荐的。
但是revert还是存在一点不足,即一次仅能回退一次push。如果我们有几十次甚至上百次的记录,一次次的单击回退不仅费时费力而且还留下了每次的回退记录,我个人觉得
revert
在这种情况下又不太优雅。
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/yudao-cloud
-
视频教程:https://doc.iocoder.cn/video/
如果真的需要回退到上百次提交之前的版本,我的建议是直接新建个分支。
在想要回到的版本处的提交记录右键,点击new branch
“
新建分支的操作仅仅增加了一个分支,既能保留原来的版本,又能安全回退到想要回退的版本,同时不会产生太多的回退记录。
但是此操作仍然建议慎用,因为这个操作执行多了,分支管理就又成了一大难题。
这个时候会跳出四个选项供你选择,我这里是选择
hard
。
其他选项的含义
仅供参考
,因为我也没有一一尝试过。
-
Soft
:你之前写的不会改变,你之前暂存过的文件还在暂存。
-
Mixed
:你之前写的不会改变,你之前暂存过的文件不会暂存。
-
Hard
:文件恢复到所选提交状态,任何更改都会丢失。
你已经提交了,然后你又在本地更改了,如果你选hard,那么提交的内容和你提交后又本地修改未提交的内容都会丢失。
-
keep
:任何本地更改都将丢失,文件将恢复到所选提交的状态,但本地更改将保持不变。
你已经提交了,然后你又在本地更改了,如果你选keep,那么提交的内容会丢失,你提交后又本地修改未提交的内容不会丢失。