首页 > 解决方案 > Git rebase,修复冲突,然后推送被拒绝

问题描述

当我rebase并且存在我解决的冲突时,我收到以下消息:

提示:更新被拒绝,因为您当前分支的尖端落后


我们有2个分支:

我正在准备feature/fix-input-height通过 rebase master 在本地解决冲突

git checkout master
git pull origin master

git checkout feature/fix-input-height
git pull origin feature/fix-input-height

git rebase master

git push origin feature/fix-input-height

并再次收到被拒绝的错误消息

提示:更新被拒绝,因为您当前分支的尖端落后


stackoverflow 上的每个人都建议:

git push origin -f feature/fix-input-height

但是强迫推动只是感觉不对

标签: gitrebasegit-merge-conflict

解决方案


Rebase 通过复制提交来工作。你开始,例如:

...--o--o--o   <-- master
      \
       A--B--C   <-- feature/fix-input-height (HEAD)

最后得到:

             A'-B'-C'  <-- feature/fix-input-height
            /
...--o--o--o   <-- master
      \
       A--B--C   [previous feature/fix-input-height, now abandoned]

但是另一个存储库——不是你的,你要求你的 Git 去的那个git push——仍然有原始提交。你不再有那些提交了。你有新的和改进的,但他们不知道。 他们只知道你要求他们丢弃三个非常好的提交。

所以他们说不,我不会扔掉那些。至少,除非您使用有力的命令,而不是礼貌的请求,否则不会。

这就是为什么你需要--force,或者——更好,尽管人们不经常使用它——<code>--force-with-lease。不管怎样,你告诉他们:是的,我的意思是你应该扔掉你的提交。 这两者之间的区别--force只是说:扔掉你的提交!改用这个! 使用--force-with-lease说:我认为你的feature/fix-input-height名字提交C。如果是这样:扔掉那些提交!改用这个! 如果有人添加了 commit D,它会失败,而你没有,因此没有包含在你的 rebase 中。


推荐阅读