Git 更新被拒绝,因为当前分支的尖端位于远程分支的后面
我们的工作流程就是这样。我们有一个名为Git 更新被拒绝,因为当前分支的尖端位于远程分支的后面,git,Git,我们的工作流程就是这样。我们有一个名为dev的分支,我可以在origin/dev上找到它。当我们进行更改时,我们会创建一个分支: git checkout -b FixForBug origin/dev 现在我有了一个名为FixForBug的分支,它正在跟踪(我认为这是正确的词)origin/dev。因此,如果我执行一个git pull,它将从origin/dev引入新的变化,这非常好。现在,当我完成我的修复后,我推到一个远程分支,名为相同的东西 首先,我从origin/dev中下拉任何更改,
dev
的分支,我可以在origin/dev
上找到它。当我们进行更改时,我们会创建一个分支:
git checkout -b FixForBug origin/dev
现在我有了一个名为FixForBug
的分支,它正在跟踪(我认为这是正确的词)origin/dev
。因此,如果我执行一个git pull
,它将从origin/dev
引入新的变化,这非常好。现在,当我完成我的修复后,我推到一个远程分支,名为相同的东西
首先,我从origin/dev
中下拉任何更改,并重新设置基础:
git pull --rebase
然后我将更改推送到同名的远程分支:
git push origin FixForBug
现在,远程服务器上有一个分支,我可以创建一个请求,请求批准该更改并将其合并回dev分支。我从不把任何东西推到origin/dev
我自己。我猜这是相当常见的工作流程
我第一次执行git push时,它工作正常并创建了远程分支。但是,如果我再推一次(比如在代码审查期间,有人指出了一个问题),我会得到以下错误:
错误:无法将某些引用推送到
'https://github.mydomain.info/Product/product.git“提示:更新被拒绝,因为当前分支的尖端位于远程分支的后面。在再次按下之前,集成远程更改(例如提示:“git pull…”)。
有关详细信息,请参阅“git push--help”中的“关于快进的说明” 但是,如果我执行一个
git status
命令,它会说我比origin/dev
早一步提交(这很有意义),如果我按照提示运行git pull
,它会说一切都是最新的。我认为这是因为我正在推进一个不同于上游分支的分支。我可以通过运行以下命令解决此问题:
git push-f origin FixForBug
在这种情况下,它会将更改推送到远程分支,说(强制更新),远程分支上的一切看起来都很好
我的问题:
为什么在这个场景中需要
-f
?通常当你强迫别人做某事时,是因为你做了错事,或者至少违反了标准惯例。我这样做行吗,或者它会把远程分支中的某些东西搞砸,或者给最终必须将我的东西合并到dev中的人带来麻烦?由于重基,实际上需要-f
。无论何时执行重基,都需要执行强制推送,因为远程分支无法快速转发到提交。您总是希望确保在推送之前进行拉送,但是如果您不想为此而强制推送到master或dev,您可以创建一个新的分支来推送,然后合并或创建一个PR。如果您不想使用-f
,那么您可以使用
git pull
而不是
git pull --rebase
非rebase将从origin/dev
获取更改,并将它们合并到FixForBug
分支中。然后,你就可以跑步了
git push origin FixForBug
无需使用
-f
来确保您的本地分支FixForBug不在远程分支FixForBug之前,在推送之前拉合并更改
git pull origin FixForBug
git push origin FixForBug
当我遇到消息“更新被拒绝,因为当前分支的提示已过期”时,我在Azure DevOps中使用的命令是/是此命令:
git pull origin master
(或者可以从新文件夹开始并进行克隆)
这个答案并没有特别针对提出的问题,但它确实回答了问题的标题/标题文本,这将是Azure DevOps用户的常见问题
我注意到Keif的回答中有这样一句话:“你总是想确保在推之前先拉一下”
除了Git命令行工具之外,我还使用了这个工具
(我不确定如何在git GUI中执行与命令行命令“git pull origin master”等效的操作,因此我回到命令行来执行此操作)
下图显示了您可能要执行的各种操作的各种Git命令:
这一定是因为提交在当前推送之前
git pull origin“要推送的分支的名称”
git-rebase
如果git-rebase
成功,那么就很好。否则,您必须在本地解决所有合并冲突,并使其继续进行,直到使用remote成功重设基础
git-rebase——继续
这就是我解决问题的方法: 假设上游分支是您的分支机构,而origin是您的存储库,您希望向上游分支机构发送MR/PR 比如说,您已经提交了大约四次,并且您得到的
更新被拒绝,因为您当前分支的提示已过期。
这就是我所做的
首先,挤压所有四个提交:
git rebase -i HEAD~4
您将获得一个写有pick
的提交列表(在编辑器中打开)
例子
到
之后,您可以保存组合提交
下一个
你需要把你的承诺藏起来
以下是方法:
git reset --soft HEAD~1
git stash
现在与您的上游分支重新建立基础:
git fetch upstream beta && git rebase upstream/beta
现在弹出隐藏的提交:
git stash pop
提交这些更改并推送它们:
git add -A
git commit -m "[foo] - foobar commit"
git push origin fix/#123 -f
这件事刚刚发生在我身上
- 我昨天向我们的主人提出了一个请求
- 我的同事今天正在查看它,发现它与我们的主分支不同步,所以为了帮助我,他将主分支合并到我的分支
- 我不知道是他干的
- 然后我在本地合并了master,尝试推送它,但失败了。为什么?因为我的同事与master合并创建了一个额外的提交,所以我没有本地提交李>
git stash pop
git add -A
git commit -m "[foo] - foobar commit"
git push origin fix/#123 -f
git pull
git push
git push origin NameOfMyBranch:NameOfMyBranch
git push -f origin master
git stash
git pull origin master
git apply
git commit -m "some comment"
git push
git push -f origin master
git push -f origin main
git push -f origin main
git checkout -b new-branch-name
git push origin new-branch-name