Learn or Die

生涯勉強。Macです。

git pushでリジェクトが起こった場合

原因

リモートリポジトリへpushするまでに、他のエンジニアがリモートリポジトリへpushなどをし、リモートリポジトリが変更されていると発生するエラー。

 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'c:\tmp\test'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

解決策

解決策は3通りあります。
履歴が綺麗になるのは方法3
現場によってそれぞれルールが違うと思うので確認してください。

方法1「git pullする」

こちらはマージコミットが作成されます。(履歴が枝分かれし、見た目があまり綺麗ではない)

手順

#リモートの変更を取り込む
$ git pull
#pushするとマージコミットが作成される
$ git push

方法2「fetchしてからmergeする」

こちらも方法1と同じくマージコミットが作成される。

手順

#リモートの変更を取ってくる
$ git fetch
#マージする
$ git merge origin/master
$ git push

方法2「git rebaseする」

git rebaseとは、「リモートリポジトリから取得した状態に対して、ローカルリポジトリでコミットを行った」という扱いになる操作。
こちらは方法1と違って、マージコミットが作られないので履歴が綺麗になります。

手順

#リモートの変更を取ってくる
$ git fetch
$ git rebase origin/master
$ git push

参考サイト

【 git push 】コマンド(応用編)――リジェクトやコンフリクトが起きたときどうするか:Linux基本コマンドTips(398) - @IT

【git】git pushがrejectされたときの対応方法 at softelメモ