Git の安全機能が表示されます。ブランチのヘッド コミットは、プッシュ先のブランチの現在のヘッド コミットの直接の子孫ではないため、Git はリモート ブランチをブランチで更新することを拒否します。
そうでない場合、ほぼ同時に同じリポジトリにプッシュする 2 人のユーザーは、新しいコミットが同時に入ってくることを認識せず、最後にプッシュした人はいずれも前のプッシャーの作業を失うことになります。彼らはこれに気づきます。
プッシュしているのが自分だけであることがわかっていて、修正されたコミットをプッシュしたい場合、またはブランチを巻き戻すコミットをプッシュしたい場合は、-f
スイッチを使用して Git にリモート ブランチを「強制的に」更新させることができます。
git push -f origin master
Git では、リモート リポジトリが構成変数を使用して遠端で非早送りプッシュを拒否できるため、これでも機能しない場合がありますreceive.denynonfastforwards
。この場合、拒否理由は次のようになります (「リモート拒否」部分に注意してください)。
! [remote rejected] master -> master (non-fast forward)
これを回避するには、リモート リポジトリの構成を変更するか、次のようにしてブランチを削除して再作成するという汚いハックが必要です。
git push origin :master
git push origin master
一般に、 の最後のパラメーターgit push
は の形式を使用します<local_ref>:<remote_ref>
。ここlocal_ref
で、 はローカル リポジトリremote_ref
のブランチの名前で、 はリモート リポジトリのブランチの名前です。このコマンド ペアは、2 つの省略形を使用します。:master
null local_ref を持っています。これは、null ブランチをリモート側にプッシュすることを意味しますmaster
。つまり、リモート ブランチを削除します。意味のないブランチ名は:
、指定された名前のローカル ブランチを同じ名前のリモート ブランチにプッシュします。master
この場合は の略ですmaster:master
。