git pull之后失败,后使用git pull --rebase origin master出现代码丢失
自己独立开发一个项目,所以代码就没有天天往git上上传,隔三岔五穿一次,在项目接近尾声的时候出现问题了。刚好前几天公司给换了一个电脑,添加**后再上传代码,没有上传成功,换仓库地址了,按理说我是git clone下来的,应该和远程仓库关联起来了,不应该存在上传失败的问题,又着急下班就没怎么在意。过了几天我想换一个远程仓库的地址吧,再此之前想解决一下为啥上传不了代码的问题,把问题放在百度上一搜,出现解决办法,囫囵吞枣就按步骤来搞了一下,这一搞出大事了,最近几天写的代码都找不到了,心如级焚啊,这不坏了,辛辛苦苦搞出来的东西难道要重写吗?我当时的心理就是,为啥不把东西搞清楚再操作,崩了啊,这TM如何是好?我使劲分析猜测问题应该就出现在git pull --rebase origin master这一操作上,最后在我不懈努力下终于搞出来,代码找回了。下面和大家分享一下我出现的问题和解决办法。
问题出现原git报错
failed to push some refs to 仓库地址
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g. hint: ‘git pull …’) before pushing again.
这个大意应该是说你的分支当前落后了,至于为啥落后了会出现git pull 无法实现的问题,我还是没有搞懂,有大神了解可以给小弟指点一下迷津。
百度该问题出现的解决方案
方案地址:https://jingyan.baidu.com/article/f3e34a12a25bc8f5ea65354a.html
我把最重要的拿出来看看
然后我就使用git pull --rebase origin master进行了操作。
随后我就崩溃的发现代码丢了,发现原因是换了地址上传后发现少了几个文件。
解决办法
执行git reflog
我再多次尝试记忆后觉得应该是commit:22那一条,因为这之前我还做了一些其他的操作,提交的备注忘记那个是那个了,这里提醒我们,备注一定要写成与当前提交原因有关的记录方法,不然忘记了自己也不知道那条是的。
随后执行 git reset --hard be20425,丢失的文件就找回来了。
感悟
经历这波操作以后,我深刻的感受到,提交代码到git仓库的重要性,当你误删,或者合并出错的时候,还可以回退到之前的版本。提交代码的时候,一定要备注原因,否则容易记混。最最重要的一点,一定要扩大自己的知识面,否则遇到问题真的很是个问题,看着很陌生,不想解决,不想突破,慢慢在历史长河中被淘汰。
git pull origin master与 git pull --rebase origin master的区别
git pull=git fetch + git merge
git pull --rebase=git fetch+git rebase
git fetch : 从远程分支拉取代码,可以得到远程分支上最新的代码。
git pull origin master与git pull --rebase origin master的区别主要是在远程与本地代码的合并上面了。
现在有两个分支:test和master,假设远端的master的代码已经更改了(在B基础上变动:C,E),test的代码更改了要提交代码(在B基础上变动:D,E),如下图:
问题就来了,如果C,F和D,E的更改发生冲突,那么就需要我们合并冲突了,下面我们来看看git merge和git rebase怎么合并的
git merge:
git rebase
对比可看出:git merge多出了一个新的节点G,会将远端master的代码和test本地的代码在这个G节点合并,之前的提交会分开去显示。
git --rebase会将两个分支融合成一个线性的提交,不会形成新的节点。
rebase好处
想要更好的提交树,使用rebase操作会更好一点。
这样可以线性的看到每一次提交,并且没有增加提交节点。
merge 操作遇到冲突的时候,当前merge不能继续进行下去。手动修改冲突内容后,add 修改,commit 就可以了。
而rebase 操作的话,会中断rebase,同时会提示去解决冲突。
解决冲突后,将修改add后执行git rebase –continue继续操作,或者git rebase –skip忽略冲突。
虽然使用rebase有好处,但是一定要谨慎使用,尽量少使用,或者不使用。