git - Git错误更新被拒绝,因为您当前分支的尖端落后
问题描述
我多次遇到这个问题,所以我想与你分享我的方法有什么问题。
我在远程存储库中有两个分支,dev
并且master
. dev
起源于master
并有 2 个新的提交。(这很常见)
现在我想dev
用更多的提交来更新远程分支,并发出合并请求以master
最终更新远程分支。
所以我做了以下
- 取出并签出
dev
。例如:git fetch & git checkout dev
- 向本地提交了两次
dev
,同时远程master
被另一个队友更新了,它有 3 次新的提交 - 所以我检查了本地
master
并提取了最新的 originmaster
。例如:git checkout master & git pull origin master
- 拉动后,我将 local
dev
与 local重新绑定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
并且有新的提交,所以它不能落后于远程。
解决方案
我的本地开发者来自远程开发者并且有新的提交,所以它不能落后于远程开发者。
是的,它可以而且确实如此,就 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。而您的本地开发人员没有!因此,远程开发人员具有您在本地开发人员中没有的提交,并且推送被拒绝。除非您的历史是遥控器历史的延续,否则您不能不使用武力推动——但事实并非如此。
推荐阅读
- c++ - 在创建 RSA_PrivateKey 时未定义对 `std::thread::_State::~_State()' 的引用
- php - Laravel:使用数据透视表获取具有各自角色的组
- node.js - 如何在 Express.js 中为每条路由存储一个变量?
- events - Dynamics CRM FetchXml 报表执行时触发的插件消息是什么
- scala - 当类型被擦除时,隐式如何找到使用泛型调用的正确方法?
- php - 如何在正则表达式中使用“或”?
- excel - 如何在公式中引用集合
- sql - 连接后操作员太慢的地方
- python - 为什么在安装 eli5 时出现 EnvironmentNotWritableError
- javascript - 从 tinymce 发布数据时,它不使用 Codeigniter 存储数据库