non-fast forward エラーで強制的にpushする

gitでリポジトリにpushしようとしたときにnon-fast forwardという下記のようなエラーがでてpushできないことがある。
git push origin master
! [rejected] master -> master (non-fast forward)
error: failed to push some refs to 'ssh://user@remotehost.git'
こういうときは --forceオプションをつけてやることで強制的にpushできる。
git push origin master --force

そもそもなんでこうなるかというと、push先のコミットの子孫でない場合にnon-fast forwardエラーが出る。入門Git (p81)
git pullやgit fetchなどで、push先のリポジトリとローカルのワークツリーをマージすることで整合性を合わせることが望ましいが--forceオプションをつけることで強制的にpushすることができる。(※)

※コメントいただきましたので、追記しました。
「pushできない場合の回避策」としましたが、説明が不足していたのと表現が適切でないためタイトルを変更しました。


入門Git

入門Git

  • 作者: 濱野 純(Junio C Hamano)
  • 出版社/メーカー: 秀和システム
  • 発売日: 2009/09/19
  • メディア: 単行本


タグ:git
posted by digital-squad at 2009年11月05日 12時44分 | Comment(2) | TrackBack(0) | Git
この記事へのコメント
むしろ、push先のコミットの子孫でないものをpushして良いのか、というのを先に考えるのが必要で、--forceは「回避策」ではありません。本当の回避策は、ワークフローを見直して--forceしないで必要な結果が得られるようにすることです。

たとえば、このエラーがでたら、まずは逆にfetchして他方での変更をマージしなおしてからpushする、とかね。
Posted by at 2009年11月06日 07:05
コメントありがとうございます、確かにおっしゃる通りですね。
自分が面倒でマージもせずに--forceした経緯があったので、説明不足でした。
Posted by DIGITAL SQUAD at 2009年11月06日 08:18
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック