【Git】[rejected] git pull non-fast-forward,git push behind 问题解决 [图文解说]

(Git)git pull non-fast-forward问题解决 [图文解说]

问题描述

在这里插入图片描述

以前遇到git push orgin 出现 non-fast-forward,然后pull 拉取再合并,推送就可以了,但是这次竟然遇到了 pull non-fast-forward ! 这是什么鬼,没见过啊,然后就搜了一些别人的解决方案,但是没有解决,于是从自己的提交记录开始想,好像是因为上一次提交push后,又 git commit --amend 操作了好几次,然后提交了一次,就是现在这次了。其实就是一次简单的偏离提交历史啦~

分析问题产生原因

目前分支的情况如图:
在这里插入图片描述
在C2推送到远程后,C2进行了多次的git commit --amend操作,该操作每次都会创建一个新的节点,所以hash值早就不是C2了,到这里是C2’‘’。当前我所在的节点是C3’,上一个节点是C2’‘’,然而在远程分支上,它还跟踪的是C2,上一个节点是C1,因为分不清C1和C2’‘‘的关系(本地分支和远程分支的上一个节点),所以认为当前分支是在C2之前,也就是本地分支当前位置和远程分支的C2失去了任何联系。git push 的错误提示如下:
push时的错误提示
使用 git pull 的错误提示如下:
在这里插入图片描述
当前分支不知道应该拉取接到哪里,所以拉取失败了。C3’上一个分支是C2’’',在远程仓库里C2的上一个分支是C1,现在要拉取C2,自然不知道该放到哪里。


解决办法

1.回退到上一次提交的位置

以我当前最后一次提交位置是C3’举例
git checkout -b temp 创建临时分支,标记最新的节点,作为“站岗”
git checkout main 切换回main分支
git checkout HEAD^ 使main分支回到C2’''节点
在这里插入图片描述

2.拉取远程分支与本地分支合并

git pull origin 拉取远程分支合并,解决冲突

在这里插入图片描述

git push origin 将合并结果推送过去
在这里插入图片描述

3.将最新的本地分支和合并后的分支合并,再推送

git rebase main tmp 将C3’和C4合并,将本地最新节点C3’变基到C4上
在这里插入图片描述
git checkout main
git rebase tmp 将main分支更新到最新
在这里插入图片描述
git push 将最新的main分支提交(本地分支上最新的代码)
在这里插入图片描述
这样就解决了"偏离分支问题"
这也是Learn Git Branching 的 远程-第7关

学习推荐: githug, Learn Git Branching
参考: git动画学习网站:https://learngitbranching.js.org/?locale=zh_CN

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值