2011-11-30 9 views
5

壊れたgit pushについていくつかの説明を読んだが、どれもこのケースをカバーしていないようだ。矛盾のないgit pushの失敗

ローカルの変更をプッシュした後も、矛盾がなくてもリモートリポジトリにプッシュできません。

$ 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%正確ではない可能性があります。

ローカル 'master'ブランチが 'origin'マスターブランチの後ろにあるようです。 '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

'push --force'は最後の手段でなければなりません。 @ DanRの答えを参照してください。 –

+0

+1は--forceが最後の手段です。 --forceを使用する状況はほとんどありません。 --forceは残りのユーザーにとって深刻な影響を与えます。 –

0

私は最近、同じ問題を抱えていましたが、あなたは「早送りしない」アップデートをしようとしています。ヘルプで「git push --help」と入力し、「早送りについての注意」を読むと、レポの履歴とは異なる履歴がローカルで開始されました。ローカル支店が最新であることが確実である場合は、git push --forceを使用してプッシュを強制して、リモートのRepoをローカルに上書きすることができます。

+0

'push --force'は最後の手段です。@ DanRの答えを参照してください。 –