1. ホーム
  2. ギット

[解決済み】Git reset --hard でリモートリポジトリにプッシュする。

2022-04-04 09:23:26

質問

私はいくつかの悪いコミット(この例ではD、E、F)があるリポジトリを持っていました。

A-B-C-D-E-F マスターとオリジン/マスター

ローカルリポジトリを具体的に修正したのは git reset --hard . リセット前にブランチを取ったので、今は以下のようなレポになっています。

A-B-C master  
     \ D-E-F old_master

A-B-C-D-E-F origin/master

さて、これらの悪いコミットの一部が必要になったので、必要な部分を選んで新しいコミットを行い、ローカルでは次のようになっています。

A-B-C-G-H master
     \ D-E-F old_master

さて、この状態をリモートリポにプッシュしたいと思います。しかし git push Gitは、丁重に筆おろしをします。

$ git push origin +master:master --force  
Total 0 (delta 0), reused 0 (delta 0)  
error: denying non-fast forward refs/heads/master (you should pull first)  
To [email protected]:myrepo.git  
! [remote rejected] master -> master (non-fast forward)  
error: failed to push some refs to '[email protected]:myrepo.git'  

リモートレポにローカルレポの現在の状態を取得させるには?

どのように解決するのですか?

強制的に押してもダメな場合( git push --force origin または git push --force origin master で十分です)、リモートサーバーが早送り以外のプッシュを拒否していることを意味するかもしれません。 receive.denyNonFastForwards コンフィグ変数 ( ギットコンフィグ のマニュアルを参照してください)、あるいは update/pre-receive フックを使ってください。

古いGitでは、この制限を回避するために git push origin :master (ただし : をブランチ名の前に置いてから、再度 git push origin master を指定したブランチです。

もし、これを変更できないのであれば、唯一の解決策は、履歴を書き換える代わりに コミットを作成する 後戻り D-E-F の変更点 :

A-B-C-D-E-F-[(D-E-F)^-1]   master

A-B-C-D-E-F                origin/master