ChatGPT解决这个技术问题 Extra ChatGPT

更新被拒绝,因为您当前分支的尖端位于其远程分支的后面

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 时,它工作正常并创建了远程分支。但是,如果我推动 second 时间(假设在代码审查期间,有人指出了问题),我会收到以下错误:

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

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

git push -f origin FixForBug

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

我的问题:

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

您收到的消息似乎是远程分支 FixForBug 在您的本地分支 FixForBug 之前。在推送之前,您应该从该远程分支中提取更改并将它们合并到您的本地分支中。
@mhatch - 所以在我推动之前基本上运行 git pull origin FixForBug ?好的,这是有道理的。随意添加作为答案!
如果您收到此错误,请执行此操作。 stackoverflow.com/a/21088381/12201407
如果您刚刚克隆了这个 repo,请尝试拉取远程源。我克隆了我们的 repo,在第一次推送之前忘记拉 develop 分支并克服了这个错误。

A
Armel

由于变基,实际上需要 -f 。每当您进行变基时,您都需要进行强制推送,因为远程分支无法快速转发到您的提交。您总是希望确保在 push 之前先执行 pull,但如果您不喜欢强制 push 到 master 或 dev,您可以创建一个新分支来 push 到然后合并或做PR。


你能澄清一下“你总是想确保在推之前先拉一下”吗?很清楚为什么需要在本地分支的 rebase 之后使用“push -f”。在这种情况下,不会通过在推送之前对遥控器进行拉动来撤消本地的变基吗?
我也在考虑同样的问题,如果我拉出我重新设置基准的文件,那么我将白白做一个重新设置基准。仍然感谢您的大力推动,但在解决这个问题时遇到了问题。
谢谢。我喜欢你解释了为什么我们必须 -f(强制)。现在说得通了。
我试过 git push -f 但它说一切都是最新的。还有其他想法吗?
我得到Sorry, force-pushing to main is not allowed
T
Talha Rafique

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

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

git push -f origin master

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


如果您的分支受到保护,最好启用强制推送
经过几分钟的挫折,这实际上对我有用
我试过 git push -f 但它说一切都是最新的。还有其他想法吗?
这个命令不会简单地将所有本地更改推送到 master 并擦除远程更改吗?
这并没有解决 OP 的情况和/或问题; OP 在远程分支上没有本地分支没有的更改。
m
mhatch

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

git pull origin FixForBug
git push origin FixForBug

OP 表示他们已经进行了 git pull 并尝试推送。您的回答不适用于 OP 的问题。
P
Peter Mortensen

设置当前分支名称,如 master:

git pull --rebase origin master git push origin master

或分支名称develop

git pull --rebase origin develop git push origin develop


G
Greg Hewgill

如果您想避免必须使用 -f,那么您可以只使用

git pull

代替

git pull --rebase

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

git push origin FixForBug

不使用 -f


Rebase 是我们工作流程的一部分。如果我不这样做,我会被骂。
@MikeChristensen:好的,那么当然要遵循记录的程序。根据您的描述,您将需要使用 -f,因为您将上游存储库上的提交替换 提交具有不同(重新定位)历史的不同提交。如果您要使用 Gerrit 之类的产品,那么它支持这种变基代码审查工作流程,而无需在推送时使用 -f。我们以这种方式在工作中使用 Gerrit,而且效果很好。
P
Peter Mortensen

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

git push -f origin main

我在本地设置中工作,我只需要强制将我的更改推送到主分支 repo,它对我来说很好
P
Peter Mortensen

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

git pull origin master

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

此答案没有解决提出的问题,特别是 Keif has answered this,但它确实回答了问题的标题/标题文本,这将是 Azure DevOps 用户的常见问题。

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

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

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

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

https://i.stack.imgur.com/TnV5B.png


P
Peter Mortensen

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

git pull origin "你要推送的分支名称" git rebase 如果 git rebase 成功,那么很好。否则,您已经在本地解决了所有合并冲突并保持它继续,直到使用远程的 rebase 成功。 git rebase -- 继续


P
Peter Mortensen

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

假设上游分支是您创建的分支,origin 是您的存储库,并且您希望将 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

P
Peter Mortensen

这只是发生在我身上。

我昨天向我们的主人提出了拉动请求。

我的同事今天在查看它,发现它与我们的 master 分支不同步,所以为了帮助我,他将 master 合并到我的分支中。

我不知道他这样做了。

然后我在本地合并master,尝试推送,但是失败了。为什么?因为我的同事与 master 合并创建了一个我在本地没有的额外提交!

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

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

git pull
git push

A
Alex Reuka

接下来我帮忙:

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

你说的“我来帮忙”是什么意思(似乎难以理解)?你能详细说明吗?
这有效,但我需要先添加 git reset --soft HEAD~1
P
Peter Mortensen

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

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

这适用于我!
E
Erick Lanford Xenes

如果你使用 TortoiseGit 推送对话

https://i.stack.imgur.com/MwE9k.png

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

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


i
iLearn

如果您真的担心任何其他方法,这些步骤可以帮助您轻松

1:将更改存储在要推送的本地分支中

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

3:从您的遥控器创建一个同名的分支,该分支将包含所有更改

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

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

6:提交和推送


P
Peter Mortensen

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

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

git push origin NameOfMyBranch:NameOfMyBranch

P
Peter Mortensen

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

它会起作用的。这对我有用...


P
Peter Mortensen

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

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


我的帖子没有相关答案。如果有的话,我会同意你的。
P
Peter Mortensen

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

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

git push -f origin main

它已经完成了。


git push -f 将覆盖上游更改,并且在技术上是正确的。大多数情况下,您希望将更改添加到现有代码中,因此您需要做的是 git fetch 获取这些更改,然后 git rebase origin/branchname 在上游重放您的更改。可能存在需要解决的合并冲突,但这样您就不会覆盖其他人的工作。
P
Peter Mortensen

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

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


P
Peter Mortensen

这取决于权限。

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


s
surender pal

首先,您必须从远程获取更改,然后才能推送更改,为此您必须编写命令

git pull 

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

git push

此修复程序对我有用,试一试,我认为由于遥控器上的冲突,我们无法推送代码


I
Ishmael Mavor Raines

我不知道为什么 git 不在他们的网站上说清楚

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

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

如果 git pull 没有解决问题,创建一个分支并切换到它。这将是您的第一次推送,您需要使用单独的分支...

git checkout -b tempbranch

“结帐”将创建临时分支。使用“git status”查看你是否在 tempbranch

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

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

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

git add file.txt

添加文件后,现在在声明区域。在这里,您可以使用 git status 查看准备提交的内容。那么你可以提交:

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

现在文件是本地仓库,你不会使用“git status”看到它。但是您可以使用“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