「リモートリポジトリの巻き戻しが拒否される」の版間の差分
(→現象) |
(→原因) |
||
41行: | 41行: | ||
設定と言えるでしょう。 | 設定と言えるでしょう。 | ||
− | + | 下記はリモートリポジトリの config ファイルの中身で、denyNonFastforwards がその設定です。 | |
true なら none-fast-forward な push は断固拒否されます。 | true なら none-fast-forward な push は断固拒否されます。 | ||
2016年12月10日 (土) 01:09時点における版
メインページ>コンピュータの部屋#ソフトウェア>Git tips
現象
リモートリポジトリに誤って登録したコミットを取り消したい場合は、 revert で打消しのコミットを登録するのがまっとうな方法です。 SCMは一度登録したものは取り消さないのが大原則で、登録したコミットを多くの人が 既にpullしていた場合、コミットの削除は大災害に発展する恐れがあるからです。
でも少人数でリポジトリを使っていて、最近誰も pull していないことがわかっているなら、 間違いで登録してしまったコミットはきれいさっぱりを削除したくなるのが人情でしょう。ごみは残したくないものです。
そういう場合は、ローカルリポジトリから
git reset HEAD~ --hard git push -f
として、push で強制的にリモートのコミットを削除するのが定石ですが、
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 を許さないので、より安全な方法と言えるでしょう。