Git 错误更新被拒绝,因为你当前分支的提示落后了
Git error Updates were rejected because the tip of your current branch is behind
我遇到过很多次这个问题,所以我想和你分享一下我的方法有什么问题。
我在远程存储库中有两个分支,dev
和 master
。 dev
源自 master
并且有 2 个新提交。 (这很常见)
现在我想用更多的提交来更新远程 dev
分支,并发出合并请求以最终更新远程 master
分支。
所以我做了以下事情
- 已提取并签出
dev
。例如:git fetch & git checkout dev
- 提交了两次到本地
dev
,同时远程 master
被另一个队友更新,它有 3 个新提交
- 所以我查看了本地
master
并拉取了最新的来源master
。例如:git checkout master & git pull origin master
- 拉动后,我将本地
dev
重新设置为本地 master
。
例如:git rebase master dev
- 然后我将本地
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。而您的本地开发人员没有!因此,远程开发人员提交了您在本地开发人员中没有的提交,并且推送被拒绝。除非您的历史记录是遥控器历史记录的延续,否则您无法无力推动 — 但事实并非如此。
我遇到过很多次这个问题,所以我想和你分享一下我的方法有什么问题。
我在远程存储库中有两个分支,dev
和 master
。 dev
源自 master
并且有 2 个新提交。 (这很常见)
现在我想用更多的提交来更新远程 dev
分支,并发出合并请求以最终更新远程 master
分支。
所以我做了以下事情
- 已提取并签出
dev
。例如:git fetch & git checkout dev
- 提交了两次到本地
dev
,同时远程master
被另一个队友更新,它有 3 个新提交 - 所以我查看了本地
master
并拉取了最新的来源master
。例如:git checkout master & git pull origin master
- 拉动后,我将本地
dev
重新设置为本地master
。 例如:git rebase master dev
- 然后我将本地
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。而您的本地开发人员没有!因此,远程开发人员提交了您在本地开发人员中没有的提交,并且推送被拒绝。除非您的历史记录是遥控器历史记录的延续,否则您无法无力推动 — 但事实并非如此。