「リモートリポジトリの巻き戻しが拒否される」の版間の差分
2行: | 2行: | ||
[[メインページ]]>[[コンピュータの部屋#ソフトウェア]]>[[Git tips]] | [[メインページ]]>[[コンピュータの部屋#ソフトウェア]]>[[Git tips]] | ||
+ | ==現象== | ||
− | + | リモートリポジトリに誤って登録したコミットを取り消したい場合は、 | |
revert で打消しのコミットを登録するのがまっとうな方法です。 | revert で打消しのコミットを登録するのがまっとうな方法です。 | ||
でも少人数でリポジトリを管理していて、最近誰も pull していないことがわかっているなら | でも少人数でリポジトリを管理していて、最近誰も pull していないことがわかっているなら | ||
− | + | 誤りのコミットはきれいさっぱりを削除したくなるものです。 | |
そういう場合は | そういう場合は | ||
26行: | 27行: | ||
− | となってしまって -f(--force) を付けても push | + | となってしまって '''-f(--force) を付けても push が拒否される場合'''があります。 |
+ | |||
+ | ==原因== | ||
これは リモートリポジトリ を | これは リモートリポジトリ を | ||
git init --bare --shared | git init --bare --shared | ||
− | というように --shared | + | というように '''--shared オプション付きで作った場合、none-fast-forward な push が断固拒否される設定になっている'''からです。 |
--shared は複数の人間でリモートリポジトリを共用するために作るときに指定するオプションで、 | --shared は複数の人間でリモートリポジトリを共用するために作るときに指定するオプションで、 | ||
一度 pull されたコミットが削除されると大惨事を引き起こす可能性のある git の特性を考えると妥当と言えます。 | 一度 pull されたコミットが削除されると大惨事を引き起こす可能性のある git の特性を考えると妥当と言えます。 | ||
− | + | 下記はリポジトリの config ファイルの中身で、denyNonFastforwards がその設定です。 | |
+ | true なら none-fast-forward な push は断固拒否されます。 | ||
<pre> | <pre> | ||
48行: | 52行: | ||
denyNonFastforwards = true | denyNonFastforwards = true | ||
</pre> | </pre> | ||
+ | |||
+ | ==対処法== | ||
+ | |||
+ | ===denyNonFastforwardsを false に設定する=== | ||
+ | |||
+ | リモートリポジトリの config ファイルの denyNonFastforwards の行を | ||
+ | denyNonFastforwards = false | ||
+ | とします。ただしこの設定では git push -f という危険な行為ができるようになってしまうのでご注意ください!! | ||
+ | |||
+ | ===リモートサーバーからコミットを直接削除する=== | ||
+ | |||
+ | リモートサーバにログインして、リモートリポジトリに対して git コマンドを実行できる権限があるなら | ||
+ | |||
+ | git reset HEAD~ --soft | ||
+ | |||
+ | を実行すれば、コミットを削れます。--soft を指定しないと リモートリポジトリでは git reset は実行できないことに | ||
+ | 注意してください。 | ||
+ | |||
+ | この方法では 禁断の git push -f を許さないので、より安全な方法と言えるでしょう。 |
2016年12月9日 (金) 05:25時点における版
メインページ>コンピュータの部屋#ソフトウェア>Git tips
現象
リモートリポジトリに誤って登録したコミットを取り消したい場合は、 revert で打消しのコミットを登録するのがまっとうな方法です。
でも少人数でリポジトリを管理していて、最近誰も pull していないことがわかっているなら 誤りのコミットはきれいさっぱりを削除したくなるものです。
そういう場合は
git reset HEAD~ --hard git push -f
が定石ですが、
g 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 reset HEAD~ --soft
を実行すれば、コミットを削れます。--soft を指定しないと リモートリポジトリでは git reset は実行できないことに 注意してください。
この方法では 禁断の git push -f を許さないので、より安全な方法と言えるでしょう。