Git 错误更新被拒绝,因为你当前分支的提示落后了

Git error Updates were rejected because the tip of your current branch is behind

我遇到过很多次这个问题,所以我想和你分享一下我的方法有什么问题。

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

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

所以我做了以下事情

  1. 已提取并签出 dev。例如:git fetch & git checkout dev
  2. 提交了两次到本地 dev,同时远程 master 被另一个队友更新,它有 3 个新提交
  3. 所以我查看了本地master并拉取了最新的来源master。例如:git checkout master & git pull origin master
  4. 拉动后,我将本地 dev 重新设置为本地 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 并且有新的提交,所以它不能落后远程的。

my local dev was originated from the remote dev and has new commits, so it can't be behind the remote one.

是的,它可以而且确实如此,从某种意义上说,Git就是这个意思。

After the pull, I rebased the local dev against the local master. e.g: git rebase master dev

就是这个原因。变基改变历史。简单地说,它用新的提交替换了重新设置的提交。你永远无法移动提交,不能使用 rebase 或其他任何东西;您只能将提交复制为不同的提交。它可能有相同的提交 message 但这只是复制的一部分。

看到了吗?不?好的,让我们在第一步之前开始,dev 从 master 中分离出来并有两个新的提交。将这些提交称为 A 和 B。这就像在远程上一样,并且 (1) 你获取并检查了它,所以在你的本地开发上也是如此:自从与 master 分离以来,你的开发具有相同的 A 和 B .

(现在忽略你在本地与开发人员所做的一切...)

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

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