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

时间:2016-09-08 20:37:59

标签: git

我是Git的新手,所以请像对待新手一样对待我。

我们的工作流程就是这样。我们有一个名为dev的分支,我可以在origin/dev找到该分支。当我们进行更改时,我们会在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.limeade.info/Limeade/product.git'提示:更新了   被拒绝,因为你当前分支的提示背后暗示:它   远程对手。整合远程更改(例如提示:'git pull   ......再次推动之前。提示:请参阅“关于快进的说明”   在'git push --help'中了解详情。

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

git push -f origin FixForBug

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

我的问题:

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

21 个答案:

答案 0 :(得分:69)

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

答案 1 :(得分:68)

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

您可以使用此命令通过本地存储库()强制更改服务器。

git push -f origin master

使用-f标签,您将用代码覆盖Remote Brach code

答案 2 :(得分:27)

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

git pull origin FixForBug
git push origin FixForBug

答案 3 :(得分:7)

如果您想避免使用-f,那么您只需使用

git pull

而不是

git pull --rebase

非rebase将从origin/dev获取更改并将合并更改到您的FixForBug分支。然后,您将能够运行

git push origin FixForBug

不使用-f

答案 4 :(得分:6)

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

git push -f origin main

答案 5 :(得分:4)

这只是发生在我身上。

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

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

从字面上讲,我在分支机构中所做的是:

git pull
git push

答案 6 :(得分:4)

设置当前分支名称(如master)

git pull --rebase origin master git push origin master

或分支名称发展

git pull --rebase origin develop git push origin develop

答案 7 :(得分:2)

当遇到消息“由于当前分支的尖端在后面而导致更新被拒绝”消息时,我与Azure DevOps一起使用的命令是/是以下命令:

git pull origin master

(或可以从新文件夹开始并进行克隆)。

此答案没有解决所提出的问题,特别是Keif在上面已经回答了这个问题,但是它确实回答了该问题的标题/标题文本,这将是Azure DevOps用户的常见问题。

我注意到评论:“您总是要确保在推入之前先拉一下!”以上Keif的回答!

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

(我不确定如何在Git Gui中执行等同于命令行命令“ git pull origin master”的操作,所以我将返回命令行以执行此操作。)

下面的图显示了您可能要执行的各种操作的各种git命令:

enter image description here

答案 8 :(得分:2)

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

1)git pull origin“您要推送的分支名称”

2)git rebase

如果git rebase成功,则为好。否则,您可以在本地解决所有合并冲突,并使其继续进行,直到成功进行远程重新设置。

3)git rebase --continue

答案 9 :(得分:2)

如果你使用 TortoiseGit 推送对话

enter image description here

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

<块引用>

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

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

答案 10 :(得分:1)

接下来我需要帮助:

dword FileSystem LongPathsEnabled

答案 11 :(得分:1)

在尝试通过Visual Studio Code进行重新设置后,我遇到了这个问题,通过仅从git输出窗口中复制命令并在Visual Studio Code的终端窗口中执行命令就解决了我的问题。

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

git push origin NameOfMyBranch:NameOfMyBranch

答案 12 :(得分:0)

您必须在提交中添加了尚未推送的新文件。检查文件并再次推送该文件,然后尝试拉/推即可。这对我有用。

答案 13 :(得分:0)

如果您尝试了上述所有方法,但问题仍未解决,请确保推送的分支名称是唯一的,并且在远程服务器中不存在。错误消息可能会引起误解。

答案 14 :(得分:0)

由于我尝试提交的分支是我在 master 下的子分支,所以我首先从存储库中删除了它(由于反向引用问题)。然后我用 push 重试,它又成功了!

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

答案 15 :(得分:0)

这取决于权限。

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

答案 16 :(得分:0)

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

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

答案 17 :(得分:0)

如果您真的担心任何其他方法,这些步骤可以毫不费力地帮助您

1:隐藏您在本地分支中要推送的更改

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

3:从远程创建一个同名的分支,它将包含所有更改

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

5:在此分支中进行更改并保存

6:提交和推送

答案 18 :(得分:0)

这就是我解决问题的方式

让我们假设上游分支是您分叉的分支,起源是您的回购,并且您想向上游分支发送MR / PR。

您已经说了4次提交,并且您得到Updates were rejected because the tip of your current branch is behind.

这就是我所做的

首先,压缩所有4次提交

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

答案 19 :(得分:-2)

推送被拒绝,因为您当前分支的提示落后了。

遇到这种情况,我就跑了:

git push -f origin main

就这样完成了。

答案 20 :(得分:-2)

快速解决方案

<块引用>

git push -f origin master