gitでリモートブランチにpush時にreject | forceオプションを使わずに解決した話

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}」を使えばよいだろう。

カテゴリー: