ume

リモートにgit pushできない

前書き

先日rails tutorial10章を勉強をしていて、ひと段落ついたのでgit pushでリモートリポジトリに送ろうとしたのですがエラーが出力されpushできませんでした。今はエラーを解決したのですが「なぜエラーが起こったのか」をシェアすることで自分のgitの理解度を上げるとともにこの記事に辿り着いた私と同じようにgit pushできなくて困っている方の少しでも参考になればと思い記事に残しています. エラーまでに私が行ったこと コミットをした後に何か間違いに気づきgit reset --hard 過去のコミットIDに戻りました.

目次

①エラーの発生.
②エラーの原因.
③解決策.

①エラーの発生

hint: Updates were rejected because the tip of your current branch is behind

英語の直訳.
リモートリポジトリの更新ができなかったよ。だってあなたのブランチの最新のコミットが遅れている. tipは「先っぽ」という意味でブランチの先っぽ=最新のコミット。behindは「後ろ」という意味ですがここでは最新の後=「遅れている」と解釈しました.

エラーの原因

要はエラーが出たのはリモートリポジトリとローカルリポジトリの最新情報が異なっているため。どうやら異なりかたの種類は2通りぐらいあるようです.

master    a --- b --- c --- d --- e
(リモート)
  
master    a --- b --- c --- d --- e
(ローカル)     

↑ローカルとリモートのリポジトリそれぞれのイラストの例です。アルファベットがコミットを表しています.
初めリモートリポジトリととローカルリポジトリが同じだとします。そして今自分はローカルのeのbranchにいるとします。 eのコミットが終わった際何かの間違いに気づいてe⇨ローカルのcの状態に戻りたいとします。 その際git reset --hard cのコミットIDで戻ったとします。それが↓の状態

master    a --- b --- c --- d --- e
(リモート)
  
master    a --- b --- c  
(ローカル)     

このローカルのcの状態からcに変更を加えてコミットしたとします。するとdではなく新しいコミットid、fというコミットができます。補足コミットするたびにコミットIDは毎回違うということを学びました.

master    a --- b --- c --- d --- e
(リモート)
  
master    a --- b --- c --- f
(ローカル)     

この状態でpushすると

hint: Updates were rejected because the tip of your current branch is behind

ローカルが遅れているからpushできないと言われる.

③解決策.

このエラーはリモートリポジトリの最新の状態をローカルにpullしていないにも関わらず、ローカルでpushしようとすると発生するエラーで、こまめにpullすることで防げるエラーである.