背景
我不小心将旧版的代码push到我的个人开发远程仓库(叫它dev吧)了,然后我想从主库(master)拿到最新的代码改一改再push到我的dev。于是,我的思路是checkout到master,本地pull拉取最新的代码到本地master分支,然后checkout到dev,然后merge,结果呢,好死不死merge也没反应,每次都显示是已经是out-of-date了,但dev分支下的文件还是旧版的,整了一个小时也没整出来。问同事吧,让我reset回滚得了,于是我作为一个git小白,回滚也走坑了。
遇到的回滚问题
我以为的回滚流程是reset --hard --> 修改代码 --> commit&push到dev,这样不就行了么?然后等我push的时候,告诉我不行,就是咋都push失败。
按道理我回滚拿到了提交旧版前的正确代码,我在这个基础上增加我的功能,再提交咋就不行了呢?问题就出现在回滚之后的提交上。
首先,有一个前提,就是每次commit和push都必须是在最新提交的commit下,什么意思呢?就是每次提交必须要在最新的版本下。假如说我依次提交A、B、C三次代码,会有三次commit,最新的版本是C版本,我现在在C的基础上开发,提交也是在C的版本下,这没问题。那回到我的背景场景,我回滚,相当于我回滚到B版本,我拿到B版本的正确代码了,我再开发,就是在B的基础上开发,此时提交相当于在B的版本下提交,这就违背了我们的在最新版本下提交的规则,因为commit的log是按顺序保存的,你从B开始的commit-log已经被C版本占据了,只能从C的commit-log后面接,这就是我push不上的原因。
解决方法
将开发完的代码拷出来,然后回到最新的版本,再将代码拷回原来的位置,这样既保证代码是对的,且版本也是最新的。拿ABC的问题为例,我reset回滚到B后,开发完,然后将开发的代码cp拷到外面,然后pull origin dev回到最新的commit版本,再将代码cp拷回来,再commit&push到origin dev就好了。
没图,凑合看吧。