git push時にエラー
「sample」ローカルブランチで作業してコミットした後、「sample」ローカルブランチの変更を「sample」リモートブランチにpush(git push origin sample)しようとしたところ、rejectされてエラーが出てしまった。
エラーメッセージ:
To /var/www/test-project
![rejected] sample -> sample (non-fast-forward)
error: failed to push some refs to '/var/www/test-project'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull …') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
「non-fast-forward」というからには、「sample」リモートブランチと「sample」ローカルブランチで、コミットの歴史が簡単にマージできないほど、ずれてしまっているのだろう。
エラーメッセージのヒントに「git pull」とあるので「git pull origin sample」など試してみるが一向に直らない。
「git push」を強制する「-f」(force)オプションを使ってしまうと、今度は別の環境からのpushがrejectされることになるので絶対に避けたい。
ローカルブランチを作り直す
いったん「git checkout -b sample-backup sample」で「sample」ローカルブランチを「sample-backup」ローカルブランチにバックアップしておく。
「git fetch」で「sample」ローカルブランチのリモートトラッキングブランチ(リモートブランチのコピー)「origin/sample」を最新にしておく。
「git branch -D sample」で「sample」ローカルブランチを削除(※このコマンドはローカルブランチで行った変更を消してしまうので、実行前は必ずバックアップしたことを確認しよう)し、「git checkout -b sample origin/sample」でリモートトラッキングブランチ「origin/sample」から「sample」ローカルブランチを作り直す。
以降、「sample」ローカルブランチに新たなコミットを追加した場合でも、「sample」リモートブランチへのpush(git push origin sample)がエラーなく行えるようになった。
「sample-backup」ローカルブランチから「sample」ローカルブランチに取り込みたいコミットがある場合、「git cherry-pick {sample-backupのコミットID}」を使えばよいだろう。