イメージで理解するGit

# はじめに
普段VSCodeの拡張機能である程度グラフィカルに操作してしまっていていたが、最近コマンドでgitを使わなきゃいけないことがあり、普段抜けてしまっているgitの知識があったなぁと感じました。
あと、gitのコマンドってイメージが湧きにくいものがあり、ついつい``ただの作業``になってしまうことがあるなと思ったため、しっかりコマンドを打つときはイメージを持って、自分が今何をしているのかを理解しながら進められるように、イメージ図を交えながら整理してみたいと思います。

# リポジトリとは
gitを使う上で最初に作成することになるのが、リポジトリです。
リポジトリとは、バージョン管理したいファイルや画像などを入れる貯蔵庫だとよく表現されます。
このリポジトリ（貯蔵庫）に様々なファイルの変更などを入れていくことで、バージョン管理を行うというイメージです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/11f0af11-97f7-1370-1b5d-acdc093277f6.png" width="400">

# git add, git commitのイメージ
先程も触れたようにgitではリポジトリに変更を登録していくことでバージョン管理を管理します。
このときに理解しておかなければいけないことが、gitにはリポジトリの他に、ワーキングディレクトリとステージングエリアというものがあることです。
普段自分が作業する際はワーキングディレクトリでファイルの変更を行い、変更は一旦ステージングエリアへ移動（add）させ、ステージングエリアからリポジトリへ登録（commit）するというイメージです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/7183a257-dcf5-325c-0950-d142c38e399a.png" width="700">
### よく使うaddコマンド
- ファイルを指定してステージング
```
git add ファイル名
```
- すべての変更をステージング
```
git add -A
```
- カレントディレクトリ以下のすべての変更をステージング
```
git add .
```

### よく使うcommitコマンド
- 通常コミット
```
git commit -m "コミットメッセージ"
```
- 直前のコミットのコミットメッセージを変更する
```
git commit --amend -m "コミットメッセージ"
```

# ブランチとは
直訳すると「枝」という意味になりますが、イメージも枝と似ています。
１本の木から複数の枝が生えているように、１つのリポジトリにも複数のブランチがあります。
並行世界（パラレルワールド）だと思っていただいても良いです。
（※厳密には違うのですが、今はこの理解でOK。詳しくはまた書きます。）
通常最初に作られるブランチはmainブランチです。このブランチから新しいブランチを作り、1つの作業を完了させ、もとのブランチにマージ（合体）するというのが一連の流れになります。
ブランチ戦略にもよりますが、通常はmainブランチで作業するということはなく、以下のようにmainブランチから派生したdevelopブランチで開発、さらに１つ１つの機能開発には専用のブランチを作って作業をし、完了するたびにマージさせます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/20de9be9-29b9-d2c0-73a8-b26fcbab6988.png" width="700">

# ブランチを切り替える（チェックアウト）
上でも触れたように、新しく機能を開発する際はまずブランチを新しく作り、そちらのブランチで作業します。
ブランチの作成方法は様々あるのですが、私はいつも以下のコマンドで作ってしまいます。
```
git checkout -b ブランチ名
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/076d9547-ec7b-be61-8fb7-662fc02a0d8f.png" width="700">

# ブランチをマージする
新しくブランチを作り、機能を開発し終えたら元のブランチに変更を合体させます。このことをマージといいます。
```
git checkout develop  //ブランチを取り込むブランチに移る
git merge feature-1  //取り込みたいブランチ名を指定してマージ
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/f671f474-eb27-c90c-135e-b253b15c3d96.png" width="700">


# push ＆ Pull Request
上の例ではローカルリポジトリでブランチをマージしましたが、実際はローカルリポジトリでマージすることはほとんどなく、リモートリポジトリにpushして、Pull Requestを作成し、リモートリポジトリ上でマージを行います。
##  リモートリポジトリとローカルリポジトリ

pushを理解する上でまず第一にイメージしておかなければいけないことが、リポジトリにはローカルリポジトリとリモートリポジトリという２種類があることです。
ローカルリポジトリとは自分のPC内のリポジトリ、リモートリポジトリとはGitHubのようなWeb上にあるリポジトリです。
普段の自分の作業はローカルリポジトリに変更をcommit(登録)し、機能が完成したときなどにリモートリポジトリにpush（送信）して変更内容をリモートリポジトリにも反映させます。
```
git push
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/87aaaaae-e34a-dbbb-9c59-7f37140115da.png" width="700">

ローカルリポジトリとリモートリポジトリは通常整合性が取れていますが、ローカルリポジトリで新しくブランチを切った場合、リモートリポジトリにはそのブランチが存在しません。そのため、そのブランチをpushすることでリモートリポジトリ上にも同じブランチを反映させます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/fadc2146-c761-fca5-11a2-fe4e7ffa2cb4.png" width="10000">
## Pull Requestでリモートリポジトリ上でマージする
ローカルリポジトリではmergeコマンドでブランチをマージしました。これをリモートリポジトリで行うためには通常Pull Requestというものを作成します。
Pull Requestでは開発した機能や変更点などを明記し、チームの仲間にapprove（承認）してもらうことでfeatureブランチをdevelopブランチにマージします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/5ed30b2e-dae8-1f63-e56b-ba4477aac73c.png" width="700">

# リモートの変更をローカルに反映させる pull
リモートリポジトリの変更をローカルリポジトリに取り込むときはpullコマンドを使用します。ここで``origin``とはリモートリポジトリを示しています。
```
git pull origin ブランチ名
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/a2f3fa4d-877b-9b4a-dd82-231fdacb18f1.png" width="700">
以上で、ローカルリポジトリでのコミットから、リモートリポジトリの変更を取り込むまでをイメージで整理してみました。
これで大枠は抑えれたので、また時間があれば深ぼったことも書いていきたいと思います。