ローカルリポジトリとリモートリポジトリに差があり、git pushが実行できない？！

この記事は海洋大技術系サークル Advent Calendar 2023の4日目です。
## はじめに

こんにちは！
12時間労働を2日連続して、課題も溜まって、アドベントカレンダーの書くネタが浮かばなくて、期限が来て焦っている大学生です。
最近のおすすめの曲は、Stephen Sanchez の "Until I Found You"という曲です。

前置きはどうでもよくて、今回は過去自分に起きたエラーについて、自分の経験談を語るのと、私と同じ境遇に立たされた人に少しでも参考になればと思いこの記事を書きました。

🚨（自分の中での解釈なので、本来の解釈と異なる場合があるかもしれないです🙇）

## 実際に起きた問題
いつも通り、編集部分があったので、VSCordでコードを編集して、
ターミナル上で
```
git add /file/path
```
```
git commit -m 'メッセージ'
```
```
git push
```
を以上の通りにターミナル上で実行したところ
以下のようなエラーを吐かれました。
```
! [rejected]
main - main (non-fast-forward)
error:failedto push some refs to
"https://github.com/hashimo000/〜（省略）
hint: Updates were rejected because the tip of your current branch is behind 
hint: its remote counterpart. 
hint:Integrate the remote changes (e.g.'git pull ..') before pushing again.
hint: See the 'Note about fast-forwards" in 'git push —help' for
```

簡単に言うと、リモートリポジトリにある最新の変更をローカルに取り込んでから、再度プッシュする必要があるということです。

この時私は、何でや？！と思いました。
なぜなら、私はbranch切って作業してないからそもそもこんなこと起きるはずなくね？
常に、ローカルからリモートへpushして、リモートはローカルより情報が新しいわけなくね？

## 原因
リモート（今回はWebページのGitHub）で、GitHubのREADME.mdファイルをいじって編集を加えたからです。

↓ここ
![スクリーンショット 2023-12-04 15.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502812/7d8fabae-179c-2e37-b70b-c4534e072c96.png)

それによって、更新された内容がリモート（GitHub）にはあっても、ローカル（自分のPC上）にはない。
→リモート（GitHub）とローカル（自分のPC上）に差異が生じるわけですね。

なんとなーく　READMEってGitHub上のツールの一つで、コードじゃない感が自分ではあるんですよね。（これ共感してくれる人いないかな笑）
## 結論
ローカルの情報が古いので、新しいリモートの情報をローカルに引っ張ってきて（pull）、再度リモートにローカルの情報を押し上げる（push)。


## 解決までの過程
とりあえず、pullするかと思い
```
git pull
```
をすると
```
hint: You have divergent branches and need to specify how to reconcile them. 
hint: You can do so by running one of the following commands sometimebefore hint:your next pull:
hint:git config pull. rebase false # merge
hint:git config pull. rebase true #rebase
hint:git config pull.ff only # fast-forward only
hint:
You can replace"git config" with "git config —global" to set a default
hint: preference for all You can also pass-rebase,
hint:—no-rebase,or 
hint:--ff-only on the command line to override the configured default per
hint:invocation.
fatal: Need to specify how to reconcile_divergent branches.
```
と吐かれます。
簡単にいうと、、ローカルとリモートのブランチの分岐をどのように解決するかを設定する必要があるというメッセージです。

git config pull.rebase false　は、リモートブランチの変更点を現在のブランチに統合するプロセスです。

今回の場合は、
```
git config pull.rebase false
```
で大丈夫だと思います。

pull.rebase false は、リモートの変更を現在のローカルブランチにマージするためのデフォルトの動作をだと解釈しています。

リモートリポジトリの最新の変更をローカルブランチに統合します。このコマンドは、リモートブランチの変更を現在のローカルブランチにマージします。
次にをターミナル上に
```
git pull origin main
```

🚨プル操作中にマージコンフリクトが発生する可能性があります。
これは、同じファイルの同じ部分がローカルとリモートで異なる方法で変更された場合に発生します。今回はローカルでREADMEを編集してないので、コンフリクトはなかったです。

その後、ターミナル上で
```
Merge branch 'main' of https://github.com/hashimo000/〜
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
```
大体こんなことが書いてます。

①コミットメッセージの本文で、マージの目的や背景を簡潔に説明します。たとえば、特定の機能の追加やバグ修正、リモートの更新の取り込みなど、マージの理由を記述します。

②#で始まる行はコメント行であり、これらの行はGitによって無視されます。実際のコミットメッセージには含まれません。

③コミットメッセージを何も入力せずに終了すると、コミットは中止されます。

重要なことだから、コメントをしてください的なことだと思ってます。

私は、「現在のローカルブランチにリモートリポジトリの最新の変更を統合」とでもコメントしました。

無事解決しました。

## まとめ
この件で、また少しGitとGitHubへの理解度が増したような気がしました笑。
pullとかはほとんど使わないので、この時にほぼ初めて使いました。
おそらくコンフリクトとか起こすともっと面倒なんでしょうね（まだ自分でコンフリクトを解決したことないのでわからないですが。）

READMEを編集する時は、リモート（Web上のGitHub）から編集したらちゃんとローカル（自身のPC上）にpullするのを忘れないようにするか、VSCord上で編集しないといけないですね。