Git推送拒绝“非快进”

Posted

技术标签:

【中文标题】Git推送拒绝“非快进”【英文标题】:Git push rejected "non-fast-forward" 【发布时间】:2013-12-26 08:37:01 【问题描述】:

我对@9​​87654322@ 还很陌生,但目前在团队环境中使用它来管理我们的代码。我遇到了一些变基问题,我使用以下方法修复了它们:

git checkout --ours filename.txt
git add filename.txt
git rebase --continue

现在我希望推送我的更改,因此运行以下命令:

$ git push origin feature/my_feature_branch

给我以下错误:

To ssh://git@coderepo.com:7999/repo/myproject.git
 ! [rejected]        feature/my_feature_branch -> feature/my_feature_branch (non-fast-forward)
error: failed to push some refs to 'ssh://git@coderepo.com:7999/repo/myproject.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

我该怎么做才能摆脱这个错误?

注意:我尽可能避免使用--force 选项。

【问题讨论】:

相关:What's a “fast-forward” in Git?. 【参考方案1】:

可能您在变基之前没有获取远程更改,或者有人推送了新的更改(当您在变基并尝试推送时)。请尝试以下步骤:

#fetching remote 'feature/my_feature_branch' branch to the 'tmp' local branch 
git fetch origin feature/my_feature_branch:tmp

#rebasing on local 'tmp' branch
git rebase tmp

#pushing local changes to the remote
git push origin HEAD:feature/my_feature_branch

#removing temporary created 'tmp' branch
git branch -D tmp

【讨论】:

这解决了我的问题:当我提交我的代码时,我做了一个 rebase(为时已晚,已经有更改,应该在提交之前完成)。然后即使没有冲突,我也无法推动。应用上述魔法后,它起作用了。谢谢。 这是完美的答案【参考方案2】:

看起来有人在你最后的git fetchgit push 之间推送了新的提交。在这种情况下,您需要重复您的步骤并将my_feature_branch 再次变基一次。

git fetch
git rebase feature/my_feature_branch
git push origin feature/my_feature_branch

git fetch 之后,我建议使用gitk --all 检查情况。

【讨论】:

如何启用 git pull origin master:master 默认为合并。这是否是合并冲突。这是被问到的唯一一个问题。【参考方案3】:

我遇到了类似的问题,我通过以下方式解决了它: git pull origin

【讨论】:

当我在拉取远程分支时收到相关错误时帮助了我。【参考方案4】:

在共享本地存储库上写锁

我遇到了这个问题,以上建议都没有帮助我。我能够正确获取所有内容。但是推送总是失败。它是一个位于 windows 目录的本地存储库,有多个客户端通过 VMWare 共享文件夹驱动程序使用它。似乎其中一个系统锁定了 Git 存储库以供编写。停止相关的VMWare系统后,导致锁的一切立即修复。几乎不可能弄清楚是哪个系统导致了错误,所以我不得不一一阻止它们直到成功。

【讨论】:

【参考方案5】:

我遇到了这个问题! 我试过:git fetch + git merge,但没有解决! 我试过:git pull,也没有解决

然后我尝试了这个并解决了我的问题(与工程师的回答类似):

git fetch origin master:tmp
git rebase tmp
git push origin HEAD:master
git branch -D tmp

【讨论】:

这把我搞砸了,我直接将东西推送到 master 并推送了一整天的部署......每个人都很生气......真棒提示! 在给某人一个危险的工具之前,可能想简要解释一下你在做什么。【参考方案6】:

好吧,我在这里使用了建议,但它把我的本地代码直接合并到了 master 中。 .... 所以把这一切都带上一粒盐。我的同事说以下有助于解决问题,需要重新指向我的分支。

 git branch --set-upstream-to=origin/feature/my-current-branch feature/my-current-branch

【讨论】:

【参考方案7】:

在 Eclipse 中执行以下操作:

GIT Repositories > Remotes > Origin > 右键单击​​并说 fetch

GIT Repositories > Remote Tracking > 选择你的分支并说合并

转到项目,右键单击您的文件并说从上游获取。

【讨论】:

【参考方案8】:

我迟到了,但我在github help page 中找到了一些有用的说明,并想在这里分享。

有时,Git 无法在不丢失提交的情况下对远程存储库进行更改。发生这种情况时,您的推送将被拒绝。

如果其他人与您推送到同一分支,Git 将无法推送您的更改:

$ git push origin master
To https://github.com/USERNAME/REPOSITORY.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/USERNAME/REPOSITORY.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

您可以通过获取并合并在远程分支上所做的更改与您在本地所做的更改来解决此问题:

$ git fetch origin
# Fetches updates made to an online repository
$ git merge origin YOUR_BRANCH_NAME
# Merges updates made online with your local work

或者,您可以简单地使用git pull 同时执行这两个命令:

$ git pull origin YOUR_BRANCH_NAME
# Grabs online updates and merges them with your local work

【讨论】:

【参考方案9】:
    将代码移至新分支 - git branch -b tmp_branchyouwantmergedin 切换到你要合并到的分支——git checkout mycoolbranch 重置你要合并的分支 - git branch reset --hard HEAD 将 tmp 分支合并到所需的分支 - git branch merge tmp_branchyouwantmergedin 推送到原点

【讨论】:

【参考方案10】:

试试这个命令

$ git push -f -u origin <name of branch>

$ git push -f -u origin master

【讨论】:

当其他人没有时,这对我的情况有效。有时你只需要告诉 git -f -u【参考方案11】:

这是解决此问题的另一种解决方案

>git pull
>git commit -m "any meaning full message"
>git push

【讨论】:

【参考方案12】:
    撤消本地提交。这只会撤消提交并保留工作副本中的更改
git reset --soft HEAD~1
    拉取最新更改
git pull
    现在您可以在最新代码之上提交您的更改

【讨论】:

【参考方案13】:

对于完全相同的错误,我也不是唯一的开发人员。

所以我同时提交并推送我的更改,在Commit 对话框弹出窗口底部看到:

...但是我犯了一个巨大的错误,忘记点击Fetch 按钮来查看我是否有最新的,而我没有。

提交成功执行,但不是推送,而是给出了相同的错误; ...即使其他开发人员没有更改与我相同的文件,我也无法提取最新的文件,因为出现了相同的错误。

图形用户界面解决方案

大多数时候我更喜欢使用 Sourcetree 的 GUI(图形用户界面)。这个解决方案可能并不理想,但这就是让我重新开始的原因,而不必担心我可能会丢失我的更改或损害其他开发人员的最新更新。

第 1 步

右键单击您之前的提交以撤消本地提交的更改并选择Reset current branch to this commit,如下所示:

第 2 步

一旦所有加载微调器消失并且 Sourcetree 完成加载上一个提交,在窗口的左上角,单击 Pull 按钮...

...然后会弹出一个对话框,点击右下角的OK按钮:

第 3 步

拉取最新后,如果您没有收到任何错误,请跳至STEP 4(下面的下一步)。否则,如果您此时发现任何合并冲突,就像我对 Web.config 文件所做的那样:

...然后点击顶部的Stash按钮,会弹出一个对话框,您需要编写一个Descriptive-name-of-your-changes,然后点击OK 按钮:

...一旦 Sourcetree 完成存储您更改的文件,重复 步骤 2 中的操作(以上步骤),然后您的本地文件将具有最新更改。现在可以通过打开 Sourcetree 左栏底部的 STASHES 重新应用您的更改,使用箭头展开您的存储,然后右键单击选择 Apply Stash 'Descriptive-name-of-your-changes',然后选择 OK 弹出对话框中的按钮:

如果您现在有任何合并冲突,请转到您喜欢的文本编辑器,例如 Visual Studio Code,并在受影响的文件中选择 Accept Incoming Change 链接,然后保存:

然后回到Sourcetree,点击顶部的Commit按钮:

然后右键单击有冲突的文件,并在Resolve Conflicts 下选择Mark Resolved 选项:

第 4 步

终于!!!我们现在可以提交我们的文件,还可以在单​​击 Commit 按钮之前选中 Push changes immediately to origin 选项:

附:在写这篇文章的时候,另一个开发者在我提交之前提交了一个提交,所以不得不重复很多步骤。

【讨论】:

【参考方案14】:

当您使用https://github.com/ 在您的 GitHub 存储库中提交了一些未拉入本地存储库的更改时,就会出现此问题

解决这个问题-

    首先从 GitHub 拉取您的存储库并更新提交或更改 您的本地存储库 然后将您的提交推送到 GitHub 存储库 您可以按照以下步骤操作
git pull <git repo HTTPS LINK>
git commit -m "updates and bugs fixed"
git push

【讨论】:

OP 从未提及 GitHub。 GitHub 是托管 git 存储库的锻造,而不是同义词

以上是关于Git推送拒绝“非快进”的主要内容,如果未能解决你的问题,请参考以下文章

Git 谜题 - 解决“拒绝非快进”问题

Git - 无法提交从eclipse到GitHub的更改

无法推送 git:权限被拒绝

Android Studio Git 推送被拒绝

Git推送错误预接收挂钩被拒绝

功能分支变基后 Git 推送被拒绝