2011-11-30 104 views
5

我读过了一些关于破坏的git推送的解释,但是他们都没有涉及这种情况。没有冲突的git推送失败

我无法将我的本地更改推送到远程存储库,即使拉出后也没有冲突。

$ git pull 
Already up-to-date 

$ git st 
# On branch unstable 
nothing to commit (working directory clean) 

$ git push 
To ssh://<url> 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to 'ssh://<url>' 
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. 

<url>当然是我的存储库的真实URL。

没有变化拉,没有冲突,我不知道还有什么可能导致此失败。

我相信我已经把一切都设置正确:

$ git remote -v 
origin ssh://<url> (fetch) 
origin ssh://<url> (push) 

$ git branch -v 
    master 175a09d [behind 18] openReview must now be called from thread other than main. 
* unstable c9e5cab Progress on attachments. 

在过去,我刚刚删除了我的本地仓库。但是,这种情况更频繁。

  1. 是什么导致了这种情况发生?
  2. 我怎样才能避免它在未来?
  3. 我该如何解决这个问题?

回答

4

完全披露 - 我的git有点生疏,所以这可能不是100%正确的。

看来你的本地'主'分支是在'起源'主分支后面。当你运行'git push'时,它会尝试用你对应的本地分支来更新所有的远程分支。要推送当前分支,请尝试git push origin unstable。另外,如果您希望您的本地主分支获得最新版本,请签出主分支并运行git pull

+0

此答案正确。另见:http://stackoverflow.com/a/8301464/156060 –

+0

你说得对。问题是主分支,我没有意识到我必须先抽出。此外,这是否意味着'git pull --all'是'git push'的真正对应物? –

1

Git基本上抱怨你的本地历史与远程历史不同。如果您重新设定分支,或者通常在您推送之后修改已提交的修订,则会发生这种情况。

为了解决这个问题,只是做

git push -f #Warning, this will essentially clobber revisions on origin with your local revisions. 

最重要的一点是,“非快速向前更新被拒绝。”通常情况下,Git可以将您的修订版本复制到远程存储库,并将HEAD修改到最新版本。但是,如果您的历史记录不同(在您将其推送到远程位置后,您在本地编辑了修订版),它不能快速前进。

+0

'推 - 力'应该是最后的手段。请参阅@ DanR的回答。 –

+0

+1 for --force是最后一招。有很少的情况下你会使用--force。 - force对其他用户有严重的副作用。 –

0

我现在有同样的问题,你正在尝试做一个'非快进'的更新。正如你可以在帮助中输入git push --help并阅读'关于快速转发的注意事项',你从本地开始了一个与你回购的历史不同的历史。如果您确定您的本地分支是最新的,您可以使用git push --force强制推送您的本地分支来覆盖您的远程回购。

+0

'推 - 力'应该是最后的手段。请参阅@ DanR的回答。 –