问题描述
这几天在开发代码的时候遇到一个问题跟大家分享一下解决思路和问题本质。
问题开始是我在开发一个需求从master分支拉出一个a的开发分支开发,然后开发完了,测完了往master里面合并,然后合并之后,另一个同事cr之后说有问题,让我revert一下。(我本来想reset的,但是那天状态不好,忘了反驳了)然后我revert之后,在a分支修复完毕之后,再次向master分支merge的时候却发现git上居然报冲突了。
然后我一看master分支,里面什么都没有(因为是从头开始的空项目)。我再在idea上面的master分支拉取代码的时候,也拉不下来东西,就是项目依旧为空。但是最有意思的地方来了。我将master分支回退到revert之前的时候却发现,master有代码需要拉取,我一拉取居然把a分支和master分支没有冲突的部分拉下来了,并且无论我怎么提交,拉取,回退这部分代码就跟狗皮膏药一样粘在了master上面,其他分支合并就会报冲突。
解决方案
当然,为了大家在解决问题的时候可以先实施检验我的方法是否符合自己的情况,我先给出解决方案。(都是常见命令,就不敲了啊,欸嘿)
首先从远程master上面拉出一个新分支b。
这个分支可以看一下log,你会发现它和master分支的log一致。
然后关键来了,你需要将b分支强制移动到revert的时候(还是敲一下命令吧)
git revert {hash}
hash就是你git log看日志时候,revert的那次的hash值。
revert之前之后都不行,必须是revert的这次。
然后再从a分支把你最新代码合并到b分支,再b分支把代码合并到master,这样master代码就是最新代码。
问题原因
主要原因就是reset和revert的区别。
简单来说reset是直接回到那次提交,而revert只是把那次提交拿出来又提交了一次。
但是revert会导致分支往前走,也就是我的a分支落后了,你新改代码上去当然冲突,冲突在master没解,所以你只能从master拉到没冲突部分。
通俗点来说,fate里呆毛王最后没死成了狮子王,咕哒子发现之后,把这段历史改回去了,但是改的时候咕哒子没法操作时间,只能把改好的历史往前推,然后进行之后历史。当然只在咕哒子这条线上没关系,后面历史线性跑就行了。但是比如其他历史的咕哒子想再塞个补丁进来,就塞不进来了,因为他们相对于后面的历史落后了一个狮子王版本,他们需要再开个宇宙,然后把狮子王版本加进来,再加自己补丁才能跟上主宇宙的咕哒子,往里面塞补丁。