リモートリポジトリの巻き戻しが拒否される
メインページ>コンピュータの部屋#ソフトウェア>Git tips
現象
リモートリポジトリに誤って登録したコミットを取り消したい場合は、 revert で打消しのコミットを登録するのがまっとうな方法です。
でも少人数でリポジトリを使っていて、最近誰も pull していないことがわかっているなら 誤りのコミットはきれいさっぱりを削除したくなるのが人情でしょう。ごみは残したくないものです。
そういう場合は
git reset HEAD~ --hard git push -f
が定石ですが、
Total 0 (delta 0), reused 0 (delta 0) remote: error: denying non-fast-forward refs/heads/master (you should pull first) To C:/git-repos/remote ! [remote rejected] master -> master (non-fast-forward) error: failed to push some refs to 'C:/git-repos/remote'
となってしまって -f(--force) を付けても push が拒否される場合があります。
原因
これは リモートリポジトリ を
git init --bare --shared
というように --shared オプション付きで作った場合、none-fast-forward な push が断固拒否される設定になっているからです。
--shared は複数の人間が供用するリモートリポジトリを作るオプションです。
一度 pull されたコミットがリモートリポジトリから削除されると大惨事を引き起こす可能性のあるという git の特性を考えると妥当な 設定と言えるでしょう。
下記はリポジトリの config ファイルの中身で、denyNonFastforwards がその設定です。 true なら none-fast-forward な push は断固拒否されます。
[core] repositoryformatversion = 0 filemode = false bare = true symlinks = false ignorecase = true sharedrepository = 1 [receive] denyNonFastforwards = true
対処法
denyNonFastforwardsを false に設定する
リモートリポジトリの config ファイルの denyNonFastforwards の行を
denyNonFastforwards = false
とします。ただしこの設定では git push -f という危険な行為ができるようになってしまうのでご注意ください!!
直接リポジトリのファイルを変更してもよいですが、リモートリポジトリに対して git コマンドで
git config receive.denyNonFastforwards false
としても同じことができます。
リモートサーバーからコミットを直接削除する
リモートサーバにログインして、リモートリポジトリに対して git コマンドを実行できる権限があるなら リモートリポジトリに対して、コマンドラインで
git reset HEAD~ --soft
を実行すれば、コミットを削れます。--soft を指定しないと リモートリポジトリでは git reset は実行できないことに 注意してください。
この方法は 禁断の git push -f を許さないので、より安全な方法と言えるでしょう。