首页 > 解决方案 > Git错误更新被拒绝,因为您当前分支的尖端落后

问题描述

我多次遇到这个问题,所以我想与你分享我的方法有什么问题。

我在远程存储库中有两个分支,dev并且master. dev起源于master并有 2 个新的提交。(这很常见)

现在我想dev用更多的提交来更新远程分支,并发出合并请求以master最终更新远程分支。

所以我做了以下

  1. 取出并签出dev。例如:git fetch & git checkout dev
  2. 向本地提交了两次dev,同时远程master被另一个队友更新了,它有 3 次新的提交
  3. 所以我检查了本地master并提取了最新的 origin master。例如:git checkout master & git pull origin master
  4. 拉动后,我将 localdev与 local重新绑定master。例如: git rebase master dev
  5. 我把我的本地推dev到了远程dev。例如:git push origin dev

但它给了我一个错误 Updates were rejected because the tip of your current branch is behind its remote counterpart.

尽管git push -f会起作用,但据我所知,我的本地dev来自远程dev并且有新的提交,所以它不能落后于远程。

标签: gitmergerebase

解决方案


我的本地开发者来自远程开发者并且有新的提交,所以它不能落后于远程开发者。

是的,它可以而且确实如此,就 Git 的意思而言。

拉取后,我将本地开发人员重新定位到本地主机。例如:git rebase master dev

这就是原因。变基更改历史记录。简单地说,它用新的提交替换了重新定位的提交。你永远不能移动提交,不能使用 rebase 或其他任何东西;您只能将提交复制为不同的提交。它可能具有相同的提交消息,但这只是复制内容的一部分。

你有看到?不?好的,让我们在您的第 1 步之前开始,其中 dev 与 master 分离并有两个新的提交。调用这些提交 A 和 B。就像在遥控器上那样,并且 (1) 你获取并检查了它,所以在你的本地开发人员上也是这样:你的开发人员从 master 分裂后具有相同的 A 和 B .

(现在忽略您在本地使用 dev 所做的所有其他事情......)

然后 (2) master 增长了, (3) 你拉了它, (4) rebase dev 到它上面。用新的提交替换了你的 A 和 B;称他们为AA和BB。

现在(5)你尝试推动开发。但是远程开发人员仍然有旧的 A 和 B。而您的本地开发人员没有!因此,远程开发人员具有您在本地开发人员中没有的提交,并且推送被拒绝。除非您的历史是遥控器历史的延续,否则您不能不使用武力推动——但事实并非如此。


推荐阅读