更新被拒绝,因为您当前分支的提示落后

Mik*_*sen 72 git

我是Git的新手,所以随意像对待新手一样对待我.

我们的工作流程如此.我们有一个分支dev,我可以到达origin/dev.当我们进行更改时,我们会在dev中创建一个分支:

git checkout -b FixForBug origin/dev

现在我有一个叫做FixForBug跟踪的分支(我认为这是正确的词)origin/dev.因此,如果我这样做,git pull它将带来新的变化,origin/dev这是伟大的.现在,当我完成修复后,我将推送到一个名为同一个东西的远程分支.

首先,我从中origin/dev删除任何更改并执行rebase:

git pull --rebase

然后我将更改推送到同名的远程分支:

git push origin FixForBug

现在,远程服务器上有一个分支,我可以创建一个拉取请求,以便批准该变更并将其合并回dev分支.我永远不会origin/dev自己施加任何东西.我猜这是非常常见的工作流程.

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

错误:未能将某些引用推送到" https://github.limeade.info/Limeade/product.git "提示:更新被拒绝,因为当前分支的提示落后于提示:它的远程对应物.在再次推送之前集成远程更改(例如提示:'git pull ...').提示:有关详细信息,请参阅'git push --help'中的'关于快进的说明'.

但是,如果我这样做,git status它说我提前origin/dev1次提交(这是有意义的),如果我按照提示运行git pull,它说一切都是最新的.我这是因为我正在推动一个与上游分支不同的分支.我可以通过运行来解决此问题:

git push -f origin FixForBug

在这种情况下,它会将更改推送到远程分支,说(强制更新),并且远程分支上的一切似乎都很好.

我的问题:

为什么-f在这种情况下需要?通常当你强迫某事时,这是因为你做错了事,或者至少违背了标准做法.我可以这样做,还是会弄乱远程分支中的某些东西,或者为最终将我的东西合并到dev中的人造成麻烦?

Tal*_*que 180

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

您可以使用此命令来强制更改具有本地存储库 () 的服务器。

git push -f origin master
Run Code Online (Sandbox Code Playgroud)

使用-f标签,您将使用您的代码覆盖远程分支代码。

  • 这个命令不是简单地将所有本地更改推送到 master 并擦除远程更改吗? (4认同)
  • 我尝试了“git push -f”,但它说“一切都是最新的”。还有其他想法吗? (3认同)
  • 经过几分钟的挫折后,这实际上对我有用 (2认同)
  • 这并没有解决OP的情况和/或问题;OP 在远程分支上没有本地分支没有的任何更改。 (2认同)

Kei*_*ken 98

-f 实际需要,因为底垫.无论何时进行rebase,都需要进行强制推送,因为远程分支无法快速转发到您的提交.您总是希望确保在推送之前执行拉动,但如果您不想强制推送掌握或开发此类问题,您可以创建一个新分支以推送到然后合并或制作PR .

  • 感谢您提供这个非常有帮助的答案!:) (13认同)
  • 您能否澄清一下“您总是希望确保在推之前先拉”这一点?很明显为什么需要在本地分支变基后“push -f”。在这种情况下,在推送之前通过远程拉取是否可以撤消本地的变基? (6认同)
  • 我也在想同样的事情,如果我提取我重新设置基准的文件,那么我将毫无意义地进行重新设置。仍然感谢您的强力推动,但在解决这个问题时遇到了问题。 (2认同)
  • 我尝试了“git push -f”,但它说“一切都是最新的”。还有其他想法吗? (2认同)

mha*_*tch 38

要确保您的本地分支FixForBug不在远程分支之前,FixForBug会在推送之前拉动并合并更改.

git pull origin FixForBug
git push origin FixForBug
Run Code Online (Sandbox Code Playgroud)

  • OP 表示他们已经做了 git pull 并尝试推送。您的答案不适用于OP的问题。 (17认同)
  • 最好避免用力推动。感谢您分享这个! (4认同)
  • 它确实适用。git pull 和 git pull origin 这是不同的东西。 (2认同)

小智 24

设置当前分支名称,如master

git pull --rebase origin master git push origin master

或分支名称开发

git pull --rebase origin develop git push origin develop


Gre*_*ill 11

如果你想避免使用-f,那么你可以使用

git pull
Run Code Online (Sandbox Code Playgroud)

代替

git pull --rebase
Run Code Online (Sandbox Code Playgroud)

非底垫将获取从变化origin/dev合并他们进入你的FixForBug分支.然后,您将能够运行

git push origin FixForBug
Run Code Online (Sandbox Code Playgroud)

没有使用-f.

  • Rebase 是我们这里工作流程的一部分。如果我不这样做,我会被骂。 (4认同)
  • @MikeChristensen:好的,那么当然要遵循记录的程序。根据您的描述,您将需要使用`-f`,因为您正在使用具有不同(重新定位)历史记录的不同提交来*替换*上游存储库上的提交。如果您要使用诸如 [Gerrit](https://www.gerritcodereview.com) 之类的产品,那么它支持这种 rebase 代码审查工作流程,而无需在推送时使用 `-f`。我们以这种方式在工作中使用 Gerrit,并且效果很好。 (2认同)

小智 10

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

git push -f origin main
Run Code Online (Sandbox Code Playgroud)


All*_*n F 9

当我遇到消息“更新被拒绝,因为当前分支的提示落后”时,我在 Azure DevOps 中使用的命令是/是以下命令:

git pull origin master
Run Code Online (Sandbox Code Playgroud)

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

这个答案没有解决提出的问题,具体来说,Keif 已经回答了这个,但它确实回答了问题的标题/标题文本,这将是 Azure DevOps 用户的常见问题。

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

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

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

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

在此处输入图片说明


Jin*_*oss 8

在我组织的 GitLab 中,没有任何东西对我有用。我最终使用了我的 featureBranch 中的以下命令

\n

在功能分支中运行以下命令

\n
git pull origin featureBranch --rebase\n
Run Code Online (Sandbox Code Playgroud)\n

如果有任何冲突,解决冲突后:

\n
git rebase --continue\nEnter commit messages -> press ESC -> enter \xe2\x80\x9c:wq!\xe2\x80\x9d and enter\ngit push origin featureBranch\n
Run Code Online (Sandbox Code Playgroud)\n


Hon*_*ney 7

这件事刚刚发生在我身上。

  • 我昨天向我们的主人提出了拉取请求。
  • 我的同事今天审阅它,发现它与我们的 master 分支不同步,所以为了帮助我,他将 master 合并到我的分支。
  • 我不知道他这么做了。
  • 然后我在本地合并master,尝试push,但是失败了。为什么?因为我的同事与 master 合并创建了一个我本地没有的额外提交

解决方案:拉下我自己的分支,这样我就可以得到额外的提交。然后其推回到我的远程分支。

在我的分支上,我确实做到了:

git pull
git push
Run Code Online (Sandbox Code Playgroud)


小智 7

就我而言,远程存储库已经有一个与我正在处理的开发分支同名的分支。我刚刚重命名了分支并推送了代码。这对我有用。

git checkout -b new-branch-name
git push origin new-branch-name
Run Code Online (Sandbox Code Playgroud)


kri*_*ris 6

这一定是因为提交是在您当前的推送之前。

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

  2. git rebase

    如果git rebase成功,那很好。否则,您已经在本地解决了所有合并冲突并保持它继续进行,直到与远程的 rebase 成功。

  3. git rebase --continue


小智 5

这就是我解决问题的方法:

假设上游分支是您派生的分支,起源是您的存储库,并且您想要将 MR/PR 发送到上游分支。

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

这是我所做的

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

git rebase -i HEAD~4
Run Code Online (Sandbox Code Playgroud)

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

例子

pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
pick c011a77 commit 4
Run Code Online (Sandbox Code Playgroud)

pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
squash c011a77 commit 4
Run Code Online (Sandbox Code Playgroud)

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

下一个

您需要隐藏您的提交。

就是这样:

git reset --soft HEAD~1
git stash
Run Code Online (Sandbox Code Playgroud)

现在使用您的上游分支进行变基:

git fetch upstream beta && git rebase upstream/beta
Run Code Online (Sandbox Code Playgroud)

现在弹出你隐藏的提交:

git stash pop
Run Code Online (Sandbox Code Playgroud)

提交这些更改并推送它们:

git add -A
git commit -m "[foo] - foobar commit"
git push origin fix/#123 -f
Run Code Online (Sandbox Code Playgroud)