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合并创建了一个额外的提交,所以我没有本地提交
    解决方案:拉到我自己的分支上,这样我就可以得到额外的提交。Th
    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