由于您当前分支的尖端不在后面,因此更新被拒绝


154

我是Git的新手,请随时将我当作新手对待。

我们的工作流程就是这样。我们有一个分支机构dev,我可以到达origin/dev。当我们进行更改时,我们将创建一个dev分支:

git checkout -b FixForBug原始/开发

现在,我有一个名为的分支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/dev1次提交领先(这很有意义);如果我遵循提示并运行git pull,则表示一切都是最新的。我认为这是因为我要推送到与上游分支不同的分支。我可以通过运行以下方法解决此问题:

git push -f origin FixForBug

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

我的问题:

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


2
似乎您收到的消息是说,远程分支FixForBug位于本地分支FixForBug之前。您应先从该远程分支下拉更改,然后将其合并到本地分支,然后再进行推送。
mhatch

4
@mhatch-所以基本上git pull origin FixForBug在我推动之前运行?好吧,这很有道理。随意添加为答案!
Mike Christensen

Answers:


198

-f 实际需要,因为底垫。每当您进行重新设置基准时,都将需要进行强制推送,因为远程分支无法快速转发到提交。您总是要确保在推送之前先进行拉动,但是如果您不想为此而强制推送到master或dev,则可以创建一个新分支以推送到,然后合并或制作PR 。


2
感谢您提供的非常有用的答案!:)
AIM_BLB

1
您能否阐明“您始终要确保在推动之前进行拉力”这一点?很明显,为什么在对本地分支进行重新设置基准之后需要“ push -f”。在这种情况下,是否通过在推入之前对遥控器进行拉动来撤消本地的重新设置?
haripkannan

51

为了确保本地分支FixForBug不在远程分支FixForBug之前,请在推送之前先拉并合并更改。

git pull origin FixForBug
git push origin FixForBug

2
OP表示他们已经进行了git pull并尝试推送。您的答案不适用于OP的问题。
帕特里克

1
最好避免施加压力。感谢您分享!
安·基尔泽

16

如果要避免使用-f,则可以只使用

git pull

代替

git pull --rebase

非基础将从中获取更改origin/dev并将其合并到您的FixForBug分支中。然后,您将可以运行

git push origin FixForBug

不使用-f


3
变基是我们这里工作流程的一部分。如果不这样做,我会大吼大叫。
Mike Christensen

1
@MikeChristensen:好的,那么当然要遵循记录的程序。根据您的描述,您将需要使用,-f因为您将上游存储库中的提交替换为具有不同(基于基础的)历史记录的提交。如果您要使用Gerrit之类的产品,则它支持这种重新编制代码审查工作流程,而不必-f在推送时使用。我们以这种方式在工作中使用Gerrit,并且效果很好。
Greg Hewgill '16

12

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

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

git push -f origin master

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


6

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

git pull起源大师

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

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

我在上面Keif的回答中指出了评论:“您总是要确保在拉动之前先拉一下!”

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

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

该图显示了您可能要执行的各种操作的各种git命令,该图是:

在此处输入图片说明


4

这只是发生在我身上。

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

解决方案:下拉我自己的分支,以便获得额外的提交。然后回到我的远程分支。

我实际上在分支机构所做的是:

git pull
git push

3

这就是我解决问题的方式

假设上游分支是您从中分支出来的,原始分支是您的回购,并且您想向上游分支发送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

2

一定是因为commit在您当前的推动之前。

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

2)git rebase

如果git rebase成功,那就好。否则,您已在本地解决了所有合并冲突,并使其继续进行,直到成功进行远程基准调整为止。

3)git rebase-继续


0

在尝试通过Visual Studio Code进行基础调整后遇到了这个问题,我的问题通过仅从git输出窗口复制命令并从Visual Studio Code的终端窗口执行命令来解决。

就我而言,命令类似于:

git push origin NameOfMyBranch:NameOfMyBranch

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.