更新被拒绝,因为您当前分支的尖端在其远程对应物后面

我们的工作流程是这样的。我们有一个名为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

现在,远程服务器上有一个分支,我可以创建一个拉取请求来批准该更改并合并回开发分支。我自己没有曾经推送任何东西到origin/dev。我猜这是一个非常常见的工作流程。

我第一次执行git push时,它工作正常并创建了远程分支。但是,如果我推送第二时间(假设在代码审查期间,有人指出了一个问题),我会得到以下错误:

错误:未能将一些裁判推送到 https://github.mydomain.info/Product/product.git
提示:更新被拒绝,因为您当前分支的尖端在其远程对应的尖端后面。在再次推送之前集成远程更改(例如提示:'git拉…')。
有关详细信息,请参阅“git ush--help”中的“关于快进的注释”。

但是,如果我执行git status,它会说我领先于origin/dev by 1提交(这是有道理的),如果我按照提示运行git pull,它会说一切都是最新的。我认为这是因为我正在推送到与上游分支不同的分支。我可以通过运行来解决此问题:

git push -f origin FixForBug

在这种情况下,它会将更改推送到远程分支,说(强制更新)出现在远程分支上是好的。

我的问题:

为什么在这种情况下需要-f?通常当你迫使什么的时候,这是因为你做错了什么,或者至少违反了标准做法。我这样做可以吗,还是会在远程分支中搞砸一些东西,或者给最终必须将我的东西合并到开发中的人带来麻烦?

1395893 次浏览

-f实际上是因为rebase而需要的。每当你做rebase时,你都需要做强制推送,因为远程分支不能快速转发到你的提交。你想确保在推送之前做了拉取,但是如果你不喜欢强制推送到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运营模式中使用的命令是/是以下命令:

git pull origin master

(或者可以从一个新文件夹开始并执行克隆)…

此答案并未解决所提出的问题,特别是Keif已经回答了这个问题,但它确实回答了问题的标题/标题文本,这将是Azure运营模式用户的常见问题。

我注意到评论:“你总是想确保你在推之前做一个拉”在Keif的回答中!

除了Git命令行工具之外,我还使用了gitgui工具。

(我不确定如何在Git GUI中执行相当于命令行命令“git拉原点大师”的操作,所以我回到命令行来执行此操作)。

一个图表显示了您可能想要执行的各种操作的各种Git命令:

在此输入图片描述

这一定是因为提交领先于您当前的推送。

  1. git pull origin "name of branch you want to push"

  2. git rebase

    如果git rebase成功,那么很好。否则,您必须在本地解决所有合并冲突并保持它继续,直到使用远程重新建立基础成功。

  3. git rebase --continue

我是这样解决我的问题的:

让我们假设上游分支是您分叉的分支,起源是您的存储库,您想向上游分支发送MR/PR。

比方说,你已经有了大约四次提交,你将获得Updates were rejected because the tip of your current branch is behind.

这就是我所做的

首先,压缩所有四个提交:

git rebase -i HEAD~4

您将获得一个写有pick的提交列表(在编辑器中打开)。

示例

pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
pick c011a77 commit 4

pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
squash c011a77 commit 4

之后,您可以保存您的组合提交

下一个

你需要隐藏你的承诺。

这里是如何:

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合并到我的分支。
  • 我不知道他这么做了。
  • 然后我在本地合并master,试图推送它,但失败了。为什么?因为我的同事与master合并创建了一个我在本地没有的额外提交

解决方案:删除我自己的分支,这样我就得到了额外的提交。然后推送将它返回到我的远程分支。

在我的树枝上我真的做到了:

git pull
git push

我在尝试通过Visual Studio Code推送重新基基时遇到了这个问题。我的问题通过从Git输出窗口复制命令并从Visual Studio Code中的终端窗口执行它来解决。

在我的情况下,命令类似于:

git push origin NameOfMyBranch:NameOfMyBranch

*"The tip of your current branch is behind its remote counterpart"*意味着远程分支上有您在本地没有的更改。Git告诉您从REMOTE导入新更改并将其与您的代码合并,然后push将其合并到远程。

您可以使用此命令使用本地存储库()强制更改服务器。远程存储库代码将被替换为您的本地存储库代码。

git push -f origin master

使用-f标签,您将使用本地存储库代码覆盖远程分支码

您必须在提交中添加了尚未推送的新文件。检查该文件,再次推送该文件,然后尝试拉/推。

它会工作。这工作对我来说…

我帮助下一个:

git stash
git pull origin master
git apply
git commit -m "some comment"
git push

设置当前分支名称,如大师

git pull --rebase origin master git push origin master

或分支名称开发

git pull --rebase origin develop git push origin develop

如果您尝试了前面的所有答案,但问题仍未解决,请确保推送的分支名称是唯一的,并且在远程数据库中不存在。

错误消息可能具有误导性。

推送被拒绝,因为您当前分支的尖端落后。

当我遇到这种情况时,我只是跑:

git push -f origin main

它被完成了。

由于我试图提交的分支是我在master下的子分支,我首先从存储库中删除了它(由于反向引用问题)。然后我重试推送,它再次工作!

注意:作为删除初始分支的一部分,我在即将进行的推送中进行了所有先前的更改,因此没有丢失代码。

这取决于权限。

您可能没有直接推送到主分支(master、开发)的权限。如果您在企业项目中,您应该将自己的主题分支推送到其远程并提交合并请求(MR)。

我们可以使用带有以下cmd的本地存储库强制更改GitHub:

git push -f origin main

在我的例子中,远程存储库已经有一个与我正在处理的开发分支同名的分支。我只是重命名了分支并推送了代码。它对我有用。

git checkout -b new-branch-name
git push origin new-branch-name

如果你真的担心任何其他方法,这些步骤可以帮助你没有任何困难

1:Stash您要推送的当地分支机构中的更改

2:重命名您的本地分支作为您未来的备份

3:从遥控器创建同名分支将拥有所有更改

4:看看这个新分支作为您的新本地分支

5:创建并保存此分支中的更改

6:提交并推送

如果您使用TortoiseGit推送对话

输入图片描述

引用来源:https://tortoisegit.org/docs/tortoisegit/tgit-dug-push.html#id692368

已知变化-这允许远程存储库 接受更安全的非快进推送。这可能会导致远程 存储库丢失提交;小心使用它。这可以防止 在遥控器上丢失其他人的未知更改。它检查是否 服务器分支指向与远程跟踪相同的提交 分支(已知更改)。如果是,将执行强制推送。 否则将被拒绝。由于git没有远程跟踪 标签,标签不能使用此选项覆盖。这通过 git推送命令的强制选项。

未知变化-这允许远程存储库 接受不安全的非快进推送。这可能导致远程 存储库丢失提交;小心使用它。这不会检查任何 服务器提交,因此可能会丢失未知的更改 远程。将此选项与包含标签一起使用以覆盖标签。这 传递git ush命令的传统--force选项。

我不知道为什么git不在他们的网站上明确这一点

首先在不更改代码的情况下清除任何git提交:

git reset --soft HEAD~1
git reset --soft HEAD~2
etc

如果git拉取没有解决问题,请创建一个分支并切换到它。这将是您的第一次推送,您需要使用SEPARATE分支…

git checkout -b tempbranch

“签出”将创建一个临时分支。使用“git状态”来查看你是否在临时分支中

确保你要推到正确的地方…

git remote add origin https://github.com/user/examplerepo.git
git remote set-url origin https://github.com/user/examplerepo.git

在tempranch上工作,然后添加新文件或文件夹,虽然您在单独的分支上,但文件夹结构与主默认分支相同。所以添加……

git add file.txt

添加后,文件现在在声明区域中。在这里您可以使用git状态查看准备提交的内容。然后您可以提交:

git commit -m "Put some print statements"  file.txt

现在文件是本地存储库,您不会使用“git state”看到它。但是您可以使用“git log”和“git ls-files”看到已提交文件的列表

既然这是你第一次推到原点……

git push -u origin tempbranch

下次你可以只在master分支上工作,这样你就可以切换到它了

git checkout master

您也可以查看此链接以获取更多信息 https://practicalgit.com/blog/do-you-always-need-u-in-push.html

首先,您必须从远程获取更改,只有这样您才能推送更改,为了做到这一点,您必须编写命令

git pull

之后,您会发现一些冲突,解决冲突,然后编写命令

git push

这个修复程序对我有用,试一试,我认为由于远程冲突,我们无法推送代码

检查您的远程分支未锁定。

我仅在自动化环境中遇到过这个问题,即Gitlab管道和Github操作,当发布期间分支被自动合并和推送时。唯一对我有效的手册解决方案是创建一个具有相同更改的新分支并在新分支上运行管道。

我还没有弄清楚如何在Gitlab和Github管道中永久修复它。

您的本地主分支:->HEAD~N->更新和新文件(无法推送到github!)

你的github主分支:->HEAD~N->Ahead NewComm 1->Ahead NewComm 2…

步骤1。重置到头~N

$  git reset --soft HEAD~N

Step2:拉Ahead NewComm 1->Ahead NewComm 2…到您当地的master分支

$  git pull origin master