5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

README編集後にgit pushしたら ! [rejected] master -> master (fetch first) errorと言われる

Last updated at Posted at 2020-11-26

記事の目的

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の意味が理解できますね)

以上です。マニアックでお役に立てる気がしませんが、参考になれば幸いです。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?