リモートのnon-bare "main"repoをセットアップし、それを自分のコンピュータにクローンしました。ローカルで変更を加え、ローカルのリポジトリを更新し、その変更をリモートレポにプッシュしました。その時点までは問題ありませんでした。
ところが、リモートレポで何かを変更しなければならなくなりました。そして、自分のローカルリポジトリの何かを変更しました。私は、リモートレポへの変更は必要ないことに気づきました。そこで、ローカルのレポからリモートのレポにgit push
しようとしましたが、次のようなエラーが出ました。
To prevent you to lose history, non-fast-forward updates were rejected リモートの変更点をマージしてから再度プッシュしてください。 詳細は '注 詳細は
git push --help
の 'about fast-forwards' セクションを参照してください。
と思ったのですが、おそらく
git push --force
とすれば、私のローカルコピーが強制的にリモートのものに変更をプッシュして、同じものにすることができると思いました。**しかし、リモートレポに戻ってコミットすると、ファイルに古い変更(メインのリモートレポが以前持っていた変更)が含まれていることに気がつきました。
回答の一つに対するコメント](https://stackoverflow.com/questions/5509543/how-do-i-properly-force-a-git-push#comment6275726_5509588)で述べたとおりです。
しかし、マスターサーバーに戻って変更を保存すると、古いステージングが表示されます。そのため、コミットしても、リポジトリが同じになりません。また、git pushを再度使用しようとすると、同じエラーが発生します。
どうすればこの問題を解決できますか?
してください。
git push origin <your_branch_name> --force
や、特定のレポがある場合は
git push https://git.... --force
これにより、以前のコミットが削除され、現在のコミットがプッシュされます。
適切ではないかもしれませんが、もし誰かがこのページを偶然見つけて、簡単な解決策が欲しいと思ったら...。
また、-f
は --force
の略であることに注意してください。
git push origin <your_branch_name> -f
も使えます。
私は本当にお勧めします。
メインレポにのみプッシュする
メインレポが bare repo であることを確認します。これは、メインレポの作業ツリーがその .git
ベースと同期していないという問題を起こさないためです。"How to push a local git repository to another computer?" を参照してください。
もしメイン (ベア) レポを修正しなければならない場合は、メインサーバー上のクローンを作成して修正を行い、それをプッシュして戻します。
言い換えれば、メインサーバーとローカルコンピュータの両方からベアレポにアクセスできるようにしておくことで、単一の上流レポから/へプル/プルすることができるようになります。