分かったつもりで分かっていなかったGit、GitHub①

タイトルの通り、分かったつもりだったんですよ。
でも、個人でしか使っていなかったしGithubDesktopで使っていたのでよく分かっていなかったのです。
きちんと理解すべく勉強してみました！

間違い等あればご指摘お願い致します。

# GitとGitHub

#### Git

ファイルの変更履歴を記録できるバージョン管理システムです。
いつ、何を変更したかが一目瞭然です。

#### GItHub

Gitを使ったWebサービスです。
お互いのコードをレビューしたりできるなど、チーム開発を便利にできます。

# リポジトリ

リポジトリとは保管庫とか棚と考えれば分かりやすいと思います。
以下の絵のようなイメージですかね。

![自由 - Frame 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/d84f82f7-9f2f-d3bf-2d7d-7067d714c9e1.jpeg)

# ローカルリポジトリとリモートリポジトリ

ローカルリポジトリは自分のPC上のリポジトリで、リモートリポジトリはWeb上のリポジトリです。
ここまでは理解できます。
私が理解できなかったのはaddとかpushとかのコマンドでどういう状態になっているかということです。
これはGitの構造を理解することで解決できました。


まずはコマンドから説明し、最後に絵でまとめを説明します。

#### add

自分の作業ディレクトリからステージング環境へ追加することです。

```
//今の作業ディレクトリ以下全ての変更を追加する
$ git add .

//指定したファイルだけ追加する
$ git sample.txt
```

#### commit

ステージング環境からローカルリポジトリへ追加することです。

```
$ git commit -m "○○○の変更"
```

#### push

ローカルリポジトリからリモートリポジトリへ追加することです。

```
$ git push origin <リモートリポジトリ名>
```

最後に絵で流れを説明します。

![自由 - Frame 1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/e5f2e0ff-a24a-a23c-55d0-3467522bcef4.jpeg)

# forkとclone

こちらも先に説明をして最後に絵で説明します。

#### fork

AさんのGitHub上のリモートリポジトリをBさんのリモートリポジトリにコピーすることです。
コピーすることでAさんのリポジトリには影響を与えず色々試せるということです。
forkは以下のようにGitHub上で行うことができます。

![スクリーンショット 2021-05-02 23.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/97acc5d5-3e10-0650-d352-9f6a6413ee0c.png)


#### clone

AさんのリモートリポジトリからBさんのローカルリポジトリにダウンロードすることです。
もしくはBさんのリモートリポジトリからBさんのローカルリポジトリにダウンロードすることです。
cloneは以下のようにGitHub上で行うかコマンドで行うことができます。

![スクリーンショット 2021-05-02 23.12.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/b98854b3-15be-e644-caaa-0efa80015fad.png)


コマンドの場合は上記のURLをコピーし以下のコマンドを入力します。

```
$ git clone <URL>
```

以下がforkとcloneを絵で説明したものです。

![自由 - Frame 1 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/c0403ac4-3b27-c2cf-ed2a-da91d181de38.jpeg)

# branch(ブランチ)

これは図で説明するのが分かりやすいですかね。
1つのリポジトリから派生して作業することで、複数人で作業することができたり、元のリポジトリに影響を与えずにコードの変更ができたりします。
ブランチを作成することを`ブランチを切る`と言います。
なんかこう、パラレルワールド的な感じですよね。並行世界がある感じ。

![自由 - Frame 2 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/71a0a35f-66e5-40fb-75cf-0ff9ad4e8c6f.jpeg)

ブランチの切り方はプロジェクトによって様々だと思いますが、GitFlowとかを見るとmain(本番環境用)からdevelopブランチ(開発)を切り、そこからさらに細かくブランチを切っていくというのが多いみたいです。

ブランチを切る際のコマンドは以下です。

```
//以下のコマンドで今いるブランチを確認
$ git branch
例： *develop
*<-このマークが今いるブランチを表す

//以下のコマンドで今いるブランチから新しくブランチを切る
$ git checkout -b sample1
->sample1というdevelopから派生したブランチを切ることができた
```


# pullrequest(プルリクエスト)とmerge(マージ)

例えばBさんがfeatureブランチで作業していて「変更したよ」とpushします。
それをdevelopブランチに合体させてもいいかを「確認して欲しいよー」とリクエストするのがpullrequest(プルリクエスト)で、OKが出て合体することをmerge(マージ)と言います。

以下が説明の図です。

説明①
![自由 - Frame 1 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/bd9bfa2f-14bb-9d10-4dad-77cb0b089706.jpeg)

説明②
![自由 - Frame 2 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/05cda653-ea82-d3d7-7583-1ca1b48e7f18.jpeg)


# pullとfetchとmerge

pullはfetchとmergeを組み合わせたものなのですが、わかりにくいので図で説明します。

先にどういう時に使うかを説明します。

例えば、AさんとBさんがいてそれぞれ同じリモートリポジトリからcloneしています。
Aさんがローカルで作業をしリモートリポジトリに反映させたものを、Bさんのローカルにも反映させたいという時にpullを使います。

コマンドは以下です。

```
//pull
$ git pull

//fetch
$ git fetch

//merge
$ git merge
```

ここで私のつまづいたポイントである`リモート追跡ブランチ`というものが出てきます。

リモートブランチはリモートリポジトリの中にあるもの。
ローカルブランチはローカルリポジトリに中にあるもので、普段pushするところ。
リモート追跡ブランチはローカルリポジトリに中にあり、リモートリポジトリをローカルにコピーしただけの読み取り専用のもの。

言葉だと分かりにくいので図にします。

![自由 - Frame 2 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/6c567887-5d39-8273-993d-3d71ba6c6581.jpeg)


今回は以上です。
次はrevert(リバート)やrebase(リベース)などまとめようと思います！