「リモートリポジトリの巻き戻しが拒否される」の版間の差分

提供: tknotebook
移動: 案内検索
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 オプション付きで作った時、none-fast-forward な push が拒否される設定になっているからです。
+
というように '''--shared オプション付きで作った場合、none-fast-forward な push が断固拒否される設定になっている'''からです。
  
 
--shared は複数の人間でリモートリポジトリを共用するために作るときに指定するオプションで、
 
--shared は複数の人間でリモートリポジトリを共用するために作るときに指定するオプションで、
 
一度 pull されたコミットが削除されると大惨事を引き起こす可能性のある git の特性を考えると妥当と言えます。
 
一度 pull されたコミットが削除されると大惨事を引き起こす可能性のある git の特性を考えると妥当と言えます。
  
リポジトリの config ファイルの denyNonFastforwards がその設定で true なら none-fast-forward な push は断固拒否します。
+
下記はリポジトリの 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 を許さないので、より安全な方法と言えるでしょう。