空のコミットをプッシュできないのはなぜですか?


35
  git commit --amend --allow-empty

それから

  git push origin master

gitは言った

! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'remoteurl'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

どうして?これを修正する方法は?

git 

回答:


56

問題は、空のコミットをプッシュすることではありません。既にプッシュされているコミットと
異なるコミット(SHA1が異なるコミット)をプッシュすることです。
それがするgit commit --amendことです:最後のコミットを変更し、新しいコミットを作成しません。

つまり、他の人がすでに複製したものとは異なる履歴をプッシュしていることになります。
それが問題にならないことが確実な場合は、プッシュを強制する必要があります。

git push -f origin master

あなたがやるべきか:

git commit --allow-empty

新しい(空の)コミットを作成し、問題なくプッシュできます。


5

Githubでプルリクエストを作成する場合。あなたはできる:

git commit --allow-empty -m "make pull request"

次に、プルリクエストを変更せずに作成します。


3

私がコメントするのに十分な評判がないので、受け入れられた答えを明確にするため:

使用するとき

git commit --amend

それはない、新しいコミットを作成します。ただし、現在のコミットには追加せず、現在のコミットの親に追加します。視覚的には、フォークのように見えます。

  O (old commit)
 /
O-O (amended commit)

Gitはこれをリモートからの逸脱と解釈します。そのため、強制せずにプッシュすることはできません。


0

プッシュしようとしているリモートブランチが現在チェックアウトされていないことを確認してください。サーバーの1つでgitリポジトリを一度作成しましたが、なぜプッシュできないのか分かりませんでした。1日かそこらのトラブルシューティングの後、サーバーリポジトリでチェックアウトされている間、リポジトリ(または必要なブランチ)にプッシュできないことがわかりました。そのため、サーバーで変更を行ったときにチェックアウトする新しいブランチを作成し、サーバーにプッシュできます。これはあなたの問題ではないかもしれませんが、サーバー上の空のgitにプッシュする際に問題が発生したときに、このようなエラーが発生していました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.