はじめに
みなさん、Gitは使っていますか?
Gitとは、チーム開発をするなら必須と言っていいバージョン管理システムです。
ここでは、リモートとローカルの構成、
それらに対するGit操作で何が起きているかを画像付きで説明します。
「よくわかってないけどpullでびゅーんて持ってきて作業したらpushすればええんやろ?」
くらいの認識の人に読んでほしい記事です。
リモートとローカルの構成
- リモートブランチ:リモートリポジトリあり、他のメンバーと共有するブランチ
- ローカルブランチ:ローカルリポジトリにあり、自分だけが触るブランチ
- リモート追跡ブランチ:ローカルリポジトリにあり、リモートブランチの状態をローカルに保存するブランチ

リモートブランチとローカルブランチは分かるけど、リモート追跡ブランチがピンと来てないなあ...
そう思ったあなた、これはあなたのための記事と言ってもいい。
git merge
他のブランチの変更内容を取り込みます。
他のローカルブランチから取り込んでもいいし、
リモート追跡ブランチから取り込んだっていい。

git merge <取り込みたいブランチ名>
ただし、リモートブランチから直接取り込むことはできません。
じゃあどうすればいいか。
git fetch
リモート追跡ブランチは常にリモートブランチと同期しているわけではありません。
誰かがリモートブランチを更新したら、自分で最新化する必要があります。
それがfetchです。

git fetch
fetchはブランチ指定もできますが、しなければ全ブランチが最新化されます。
これをして損することはまずないので基本これで問題ないです。
リモートブランチの内容をローカルブランチに取り込みたい時は、
fetchして最新化したリモート追跡ブランチをmergeすればいいのです。
なんかめんどくさくない?
git pull
それを一度にやってくれるのがpullです。
pullはリモート追跡ブランチをfetchで最新化し、それをmergeしているのです。

git pull
mergeはカレントブランチ(今いるブランチ)にしかされませんが、fetchは前述の通り全ブランチに対して行われます。
git push
これは逆にローカルブランチの変更内容をリモートブランチに反映するものです。
同時にリモート追跡ブランチにも反映されます。

git push
こちらはpullのように実は2段階で~のようなことはありません。
リモート追跡ブランチは文字通り「リモートを追跡する」ためのものなので、
一旦リモート追跡ブランチに反映してリモートブランチより進んだ状態にする意味はないという思想なのでしょう。
まとめ
以上、普段なんとなくで使っているコマンドの理解が深まれば幸いです。
ここまで読んでいただきありがとうございました。
おまけ
fetchって使うことある?全部pullでよくない?
あります。
例えば他のメンバーがfeatureブランチをpushして、自分がそのブランチをローカルに持ってきたい時。
この時点では自分のローカルにfeatureブランチはないのでpullできません。

こういう時は、まずfetchしてリモート追跡ブランチを最新化しましょう。
git fetch

その後、git branchすることでリモート追跡ブランチからローカルブランチを作成できます。
git branch feature origin/feature

git switchを使うことで、作成するだけでなくそのブランチに切り替えることもできます。
ブランチを作ってそのまま作業したいことが多いと思うので、基本こちらを使えばいいと思います。
git switch -c feature origin/feature
git checkoutでも同じことができるのですが、今はswitchが推奨されているようです。
(自分はcheckoutで覚えたので今もこちらを使ってしまいます...)
git checkout -b feature origin/feature
以上、おまけでした。
