我无法在Git上进行推送?

15

git push origin master 显示错误

无法将一些引用推送到 'git@github.com:xyz/abc.git' 为了防止您丢失历史记录,非快进更新被拒绝 在再次推送之前,请合并远程更改。请参阅 'git push --help' 中的“有关快进”的注释以获取详细信息。

这是什么?如何恢复?


2
你有看过“git push --help”中的“关于快进的注释”部分吗?这里不方便复制粘贴,但它详细描述了问题,包括ASCII艺术图。 - Michael Mrozek
6个回答

30

请查看GitHub帮助页面中的“推送分支”章节

处理“non-fast-forward”错误

偶尔在推送时可能会遇到此错误:

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

这个错误可能会让人有些不知所措,但不要害怕。 简而言之,git 不能在不丢失提交的情况下在远程进行更改,因此它拒绝推送。通常这是由于其他用户向相同的分支推送造成的。 您可以通过获取和合并远程分支或使用 pull 一次性执行两个操作来解决此问题。 在其他情况下,此错误是由使用诸如 git commit --amend 或 git rebase 等命令在本地进行破坏性更改造成的。 虽然您可以通过在 push 命令中添加 --force 来覆盖远程,但只有在您绝对确定这就是您想要做的时候才应该这样做。强制推送可能会给已获取远程分支的其他用户带来问题,并被认为是一种不好的做法。如果不确定,请不要强制推送。

如评论中Michael Mrozek所述,关于git push"快进提示"注释,还有更详细的内容。


7
除了VonC的回答之外,
如果你打算用本地文件覆盖远程文件,
  $git push --force

没问题。

正如VonC的回答所说:“虽然您可以通过在推送命令中添加--force来覆盖远程分支,但只有在您绝对确定这就是您想要做的时候才这样做。” - Intrications

3

非常重要:如果您所在的分支(想要合并的分支)和上游分支的名称不同,也可能会发生这种情况。此时工作流程可能如下:

git pull --rebase             # to retrieve upstream changes, replay yours on top
git push --dry-run --verbose origin HEAD:master   # always good idea: dry-runs..
git push origin HEAD:master   # actually push current branch head (non-master) to upstream master

2

先拉取再推送

使用命令 git pull origin 任意分支名


2

如果你遇到了这个错误,而你的.git/config文件是正确的,那么请按照以下步骤进行操作(这是在git仓库中处理子模块时常见的问题-请从子模块目录中执行以下操作)

  1. 切换到主分支:git checkout master
  2. 拉取最新代码:git pull
  3. (合并会在后台进行)
  4. 推送更改:git push

我不太确定你在这里想要表达什么?请更清楚地解释一下。 - Steve P
他正在尝试查看您是否试图从分支推送并收到拒绝消息,请按照步骤操作,一切都会很好...这对我非常有效...谢谢jclaan...是的,它在后台完成了合并。 - z atef

0
我也遇到了这个问题,在 StackOverflow 上找不到一个明确说明以下有用信息的地方:如果你的工作分支与目标分支分叉了,Git 就不允许你推送到另一个分支。但是有一个简单的解决方法——切换到你想要推送到的分支,然后将你的工作分支合并到它上面。所以,不要试图这样做:
git push origin master   <========== On "mybranch"

做这个:
git checkout master      <========== Switch to the branch you want to push to
git pull origin master   <========== Get latest from remote repository
git pull origin mybranch <========== Merge in changes from "mybranch"
======== Resolve any issues ========
git push origin master   <========== Push the merged changes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接