Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

Gitでpushできず、エラー「Updates were rejected because the remote contains work that you do」が出た場合の解決方法

Gitでpushできず、エラー「Updates were rejected because the remote contains work that you do」が出た場合の解決方法

今回はGitでエラーメッセージ「Updates were rejected because the remote contains work that you do~」が出てpushできない場合の対処・解決方法の解説です。

エラーメッセージとその意味は?

エラーメッセージの内容

Updates were rejected because the remote contains work that you do

hint: not have locally. This is usually caused by another repository pushing

hint: to the same ref. You may want to first 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.

ちなみに、この英文の読み方ですが、各行の「hint:」の部分は無視して、

Updates were rejected because the remote contains work that you do not have locally. This is usually caused by another repository pushing to the same ref. You may want to first integrate the remote changes (e.g., ‘git pull …’) before pushing again. See the ‘Note about fast-forwards’ in ‘git push –help’ for details.

という文となります。

エラーメッセージの解説

このエラーメッセージを簡単に要訳しますと、

「Github上のリモートリポジトリについてすでに別のpushがなされたため、その内容が変更されています。この場合は自分がpushする前に、「git pull」などのコマンドによってリモートリポジトリの変更内容を、自分の手元PCのリポジトリにも反映させてからもう一度pushしましょう」

というものになります。つまり、リモートリポジトリが最新であって、手元にあるローカルリモートリポジトリが古い場合に出るメッセージの1つです。そのときの簡単なイメージ図がこちらです。

リモートリポジトリ(Githubにあるものなど)ローカルリポジトリ(手元PCにあるもの)
A→A1へ変更A→A2へ変更

もしこのようにGithub上のリポジトリの内容と、ローカルのそれにズレが生じていた場合、上の表でいうA1とA2という2つの変更の関係性が問題となります。たとえば次のような関係性が考えられます。

  • A1+A2にするか?
  • A1を採用すべきであり、A2は捨てるべきか?その逆のほうがいいのか?

仮に「A→A1+A2」としたい場合に、ローカルの変更(A→A2)を直接リモートリポジトリに適用してしまうと、「(A1を無視して)A→A2」となってしまい、「A1+A2」という内容にはなりません。かなり大雑把な説明ですがこのような問題が生じてしまいます。

解決方法

そこで上の表において「A→A1+A2」という結果にしたいならば、まず自分のローカルリポジトリにA→A1を適用してから、A2をpushすればいいということになります。

そうすれば、ローカルリポジトリの内容が「A→A1→A1+A2」となり、それをリモート側へpushすればリモート側も「A→A1→A1+A2」となります。ものすごく雑にいうとこのような感じです。

というわけでまずはリモート側の内容をローカル側にマージ(統合、適用)しましょう。具体的には、

git pull コマンド(実際にはリモートリポジトリのブランチ名やローカルリポジトリのブランチ名などの入力も必要でしょう)

を使ってリモート側のデータをローカル側へpullします。

それが完了してからA2への変更をpushすれば無事にpushが成功します。動画学習サイトUdemyにもGitの使い方を説明するわかりやすい人気の動画講座があります。ぜひ利用してみてください。