記事の目的
READMEをGithubにて編集後、git pushしたら ! [rejected] master -> master (fetch first) errorなどと言われ、その対処法を書いた記事になります。
筆者は、プルリクとかマージとかはやったことがあるけれども、失敗してログが出るとビビってしまう初心者of初心者なレベルです。
同じようなレベルで困っている方にログを示しながら、丁寧に解説することにより助けとなれば幸いです。(参考書や記事等をソースに書いております。)
解釈や理解が間違っていたら、ご指摘頂けると幸いです。
##環境
Rails6,ローカル環境
##git pushしたら ! [rejected] master -> master (fetch first) errorと言われる
zen_fumi$ git push origin master
To https://github.com/XXXXX.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'https://github.com/XXXX/XXXX.git'
hint: 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.
以下の記事にこのログが出たらgit fetch && git merge origin/masterしてからpushすればOKと書いてあったのでそのように対処しました。
https://qiita.com/takanatsu/items/fc89de9bd11148da1438
zen_fumi$ git fetch
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Total 26 (delta 14), reused 14 (delta 14), pack-reused 12
Unpacking objects: 100% (26/26), done.
From https://github.com/XXXX/XXXX
a0a483e..b9b2fac master -> origin/master
b16c768..87e5c6f Like_function#5 -> origin/Like_function#5
zen_fumi$ git merge origin/master
Merge made by the 'recursive' strategy.
README.md | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
zen_fumi$ git push origin master
Enumerating objects: 34, done.
Counting objects: 100% (28/28), done.
Delta compression using up to 4 threads
Compressing objects: 100% (12/12), done.
Writing objects: 100% (13/13), 1.19 KiB | 611.00 KiB/s, done.
Total 13 (delta 9), reused 0 (delta 0)
remote: Resolving deltas: 100% (9/9), completed with 6 local objects.
To https://github.com/XXXX/XXXX
b9b2fac..205a9cc master -> master
コマンドはうまく入ったようですが、何が起きているのさっぱり。
基礎知識を入れて理解してみました。
###まず、git fetchとは何?[ノンプログラマーなMacユーザーのためのGit入門から引用]
フェッチ(fetch)という操作を行うと、リモートブランチをリモート追跡ブランチに取得できる。そうすることで、リモートブランチの変更点をローカルブランチに反映する前に、リモートブランチの内容を確認できるわけです。確認後ローカルブランチにて反映してよければ、リモート追跡ブランチをローカルブランチにマージすればOKです。プルは、フェッチとマージという一連の処理を組み合わせたものです。
fetchによって、リモートで変更(READMEを編集)を反映させたリモートのmasterブランチをリモート追跡ブランチに取得できるんですね。
リモート追跡ブランチとは?と聞こえてきました。説明します。
###リモート追跡ブランチとは?[ノンプログラマーなMacユーザーのためのGit入門から引用]
origin/masterのようにorigin/~となっているもので、リモートリポジトリではありません。(git branch -aでorigin/~を確認してみてください)
リモートリポジトリをローカルにコピーしたもので、そのブランチは「リモート追跡ブランチ」と呼ばれます。リモート追跡ブランチは読み取り専用のブランチでユーザが直接変更することはできません。
イメージしにくい方は、以下の記事を読むとよりイメージを理解することができました。
https://shinmedia20.com/git-remote-tracking
ややこしいですが、リモートリポジトリのリモートブランチを追跡しているローカルに存在しているブランチとでもいえるでしょうか。
##まとめ
概念を入れた上で一連の流れをまとめます。
ローカルからリモートにpushしようとしたが、まずGithubでREADME.mdを編集しmasterに反映させた部分をローカルに反映させる必要があった。
だから注意されました。
そして、ローカルに反映させる為に
リモート(Github)でREADME.mdを編集して反映させたリモートブランチをfetchによってリモート追跡ブランチに取得。
その後、git merge origin/masterにより、リモート追跡ブランチ(リモートで変更したmasterブランチが呼ばれている)をローカルブランチにマージします。(上の説明・記事を読めば origin/masterの意味が理解できますね)
以上です。マニアックでお役に立てる気がしませんが、参考になれば幸いです。