原因
下の流れで作業したため怒られました。
①mainからブランチを切って作業
$ git checkout -b 作業ブランチ
のち、色々実装して、push
② ①と並行して、githubのmainブランチのreadmeの内容を変更
※ここが不味かった
③mainチェックアウト
$ git checkout main
④作業ブランチをマージ
$ git merge 作業ブランチ
⑤mainブランチをpush
$ git push
ここで! [rejected] main -> main (fetch first) error: failed to push some refs to "リモートリポジトリ名"
と怒られる。
対処法
$ git pull すれば、解決はするのですが、そもそもgitの構造を理解していなかった。
追跡ブランチの存在
リモートのmainとローカルのorigin/mainは別物ということを知らず、全く意識していませんでした。
ローカルのorigin/mainは、追跡ブランチと呼ばれているそうで、リモートのmainブランチを追跡しています。
pushする際に、リモートブランチをローカルの追跡ブランチに差分があると、(共通のコミット上に異なるコミットが追加されている状態)、pushできない。
今回、push出来なかったのは、リモート側のブランチに余計なコミットがあったため、push出来なかった。
git pullするとどうなるのか
git pullすると、リモートのブランチの内容が追跡ブランチに反映されます。そうすることで、差分がなくなり、pushできるようになります。
おまけ
git pullだけでもいいですが、省略せずに書くと、このようになります。
$ git pull origin main:main
# git pull <ローカルのブランチ名>:<リモートのブランチ名>