【🔰初心者向け】Git入門 [pull, branch, switch]

## はじめに
こんにちは！ITスクールRareTECHにてCS（Customer Support）を担当している池村です。今回の記事はGitのブランチ周りの解説記事です。前回の記事の続きですので、先に以下の記事を読むことを推奨します。

https://qiita.com/ikemura-ren/items/82f096910aef0f5cdcf3

![5013810f-3cf4-410f-ac56-90382f684aed_720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/6053ac86-48d6-4137-ab86-ef7d75c17811.png)


## ブランチとは？
まずブランチってなに？というお話ですが、直訳で枝のことですね。
Gitでは中心の幹のような役割を持つmainブランチと、そこから枝分かれした様々なブランチを使って開発をしていきます。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/039856ff-2ff3-443c-b4e0-e34c7d4b220c.png)

:::note info
枝分かれしたブランチは、最終的にmain（幹）にくっつけて統合することができます。なので、よく木に例えられますが、完全に一緒ではありません
:::

#### では実際にブランチを切ってみましょう
前回の続きですので、以下の画像のような状態になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/0301d454-4cd7-448b-9660-e4091a5c7af7.png)

:::note warn
上記画像のようになっていなくても良いです。
:::


前回の記事ではブランチを切って作業をしているわけではないので、ブランチ数は1、mainブランチしかない状態です。

実際にローカルでのブランチ数を見てみましょう。
```Bash:ブランチの確認
git branch 
```

上記コマンドを叩くと、ブランチの一覧が表示されます。
```Bash:ブランチ一覧が表示される（現在はmainのみ）
* main
```

まだ幹しかない状態ですね。
では枝を増やしていきます。以下のコマンドを実行してみましょう。
```Bash:使い方
git branch test-branch1
```
以下の画像のようになれば新しいブランチが作られています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/635a72b2-26a8-4517-b48c-e41b4e0d4e16.png)

:::note warn
今回はブランチを作っただけなので、現在自分がいるブランチはmainのままです。**※ここの理解大事！**

自身の今いるブランチがどこなのかを理解していないと、よくない操作をしてしまいます。ご注意ください。
:::


## ブランチを切り替えて作業をしよう
ではブランチが作られたところで、そのブランチに移動をします。
```Bash:ブランチを切り替える
# 推奨
git switch test-branch1

# 古い書き方（これでも動きます）
git checkout test-branch1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/fa434929-842f-48ed-8eed-4d55f28eb979.png)

`*`がついているのが、現在いるブランチになります。
さて、この状態で何が変わったのでしょうか？正直に言いますと、何も変わっておりません。mainブランチと、test-branch1に、まだ何も差分はない状態です。

:::note info
`ls`コマンドを叩いてみたり、`cat`コマンドを叩いてファイルの中身を確認してみましょう。
:::

ではここからは`test-branch1`でファイルを編集したり、作成したりしてみます。

```Bash:mainブランチとの差分を作る
echo 'test-branch1 Create!!' >> test.txt
touch test2.txt
```

上記のコマンドを作成したら、`add`、`commit`を行います。
```Bash:変更を確定させる
git add .
git commit -m "test.txtにブランチを作成したとわかるメッセージを入れた。test2.txtを作成した。"
```

さて、ここで初学者が押さえて欲しいポイントは、この変更は**`test-branch1`と言うブランチでしか反映されていない**と言うことです。

実際にブランチを戻してみて、ファイルの中身を確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/8c786737-bd19-407c-b368-9b199dc96c8a.png)

上記のように`main`ブランチに戻ったら、次に`cat`コマンドで`test.txt`の中身をのぞいてみましょう。

```Bash:mainブランチのファイルの中身は..?
cat test.txt
```

おそらく何も書かれていないので、`cat`コマンドを打っても何も表示されないと思います。`test-branch1 Create!!`と書かれた`test.txt`は`test-branch1`の方にしか存在しないと言うことですね。

では`test-branch1`に戻りましょう。
`add`、`commit`は完了していますので、一度リモートにプッシュしてしまいます。
```Bash:pushする
git push origin test-branch1
```

:::note warn
ここで注意点ですが、pushをするのはブランチ自身です。リモート（Web上のGitHub）にはまだ`test-branch1`のブランチは存在しないので、送ってあげる必要があります。
:::

この`push`が問題なく実行されると、以下の画像のようになります。

![名称未設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/1829e744-1829-4dc2-897f-d21a63211ec3.jpeg)

:::note info
赤枠で囲っているところが、新しく表示されていますね。この`Compare & pull request`ボタンを押すことによって、**プルリクエストと言うものを作ることができます**。
:::


## プルリクエストを作成して、`main`ブランチと統合しよう
ではこの`Compare & pull request`ボタンを押してみましょう。
以下の画像のようになると思います。

![名称未設定1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/3b7f293c-ee2b-4786-be60-9151f897229d.jpeg)

:::note warn
今回は赤枠の3つをメインに解説いたします。
:::

#### ①はどのブランチと、どのブランチをくっつけるか？
ここは左側にあるのが`main`ブランチ。統合先です。右にあるのが`test-branch1`ブランチで、先ほど`push`したブランチですね。
なので、この状態がどういうものか、まだピンときていない方向けにいうと。。

##### `main`ブランチに`test-branch1`で差がある部分をくっつけようとしている！差分がないファイルとかはそのままで！

となります。

:::note info
緑色で、`Able to merge`と書かれていたら、問題なく統合することができる！と考えてもらって結構です。
:::


#### ②はプルリクエストのタイトル
このプルリクエストが何を変更したのかわかりやすいメッセージを書く必要があります。ただ、大体デフォルトでコミットメッセージが入ります。なので、コミットメッセージがわかりやすい内容であれば問題ありません。

#### ③は変更した部分の詳細を書くところ
詳細部分では、実際にタイトルだけではわからないところについて詳細を書くことができます。マークダウン形式で書くことができるので、わかりやすく見やすい詳細を書いてあげましょう。

:::note info
マークダウン記法がわからない方は、以下のページを参照してください。
:::

https://qiita.com/kamorits/items/6f342da395ad57468ae3

#### では今回はそのままプルリクエストを作成します
右下の緑色のボタンを押しましょう。

![名称未設定2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/898f93bb-20d6-4dbd-9f0e-b9346e2f3b45.jpeg)

ボタンを押すと、以下の画像に遷移するはずなので、今度は左下にある緑色のボタンを押しましょう。

![名称未設定3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/499f2c7d-3d64-4992-84d4-16ef2640c7cd.jpeg)

画面が変わったら、再度左下のボタンを押下。
![名称未設定4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/401caf7b-6cfe-4eb1-9bc5-0a95c314fedb.jpeg)

紫色でMergeと出ていたら、くっつけることに成功しました。
これで、**リモートの**`main`ブランチに、`test-branch1`ブランチの変更部分が反映されています。**リモートリポジトリ**はこれでOKです。

## ローカルにも変更差分を持ってこないといけません
今度は、ローカルの`main`ブランチに変更を反映させる必要が出てきました。
今現状は、リモートリポジトリの`main`ブランチは、`test-branch1`の変更点が反映されて最新の状態です。ですが、ローカルの`main`ブランチには何もありません。

ここで出てくるのが`pull`コマンドです。

ではローカルの`main`ブランチに移動して、コマンドを叩いていきます。

```Bash:ブランチをmainに戻す
git switch main
```

```Bash:pullを試してみる
git pull origin main
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/6e18b679-e0ba-4f11-9f1c-d11bf142036c.png)

:::note info
上記の画像のようになっていたら成功です。`cat`コマンドなどで、ファイルの中身も確認してみましょう。
:::

この作業は、実際の現場でも**必ずやらないといけない作業**です。
実際の現場では`main`は本番用、それとは別に`develop`ブランチを開発用として作るパターンが多い（と思う）ので、`develop`ブランチを常に最新にしておく必要があります。

最新である`develop`ブランチを元に、別のブランチを切って作業。。というのが基本的な流れです。ここで`pull`をせずにブランチを切って作業をすると、**コンフリクトと呼ばれる問題の発生する確率が跳ね上がります**。

1. 自分のブランチで作業を完了させる
1. リモートにpushする
1. プルリクエストを送る
1. レビュワー（大体プロジェクトの責任者やCTOとかが行う）がレビューする
1. マージ（統合）される
1. 他の開発者はローカルの環境を最新版にするため、`pull`を行う

:::note info
大体こんな流れで作業は進んでいきます。
:::


## `pull`コマンドってどうなっているの？
さて、ローカルを最新版にする時、`pull`コマンドを使うのですが、このコマンドは別の2つのコマンドをまとめて実行しているコマンドです。

その二つが以下です。
- **`fetch`コマンド**
- **`merge`コマンド**

#### `fetch`コマンド
このコマンドは、ローカルにリモートの情報を持ってくるためのコマンドです。これ単体ですと、変更された内容はローカルのブランチに反映されることはありません。

ただ、情報は持ってきているため、現在のローカルの`main`ブランチと、リモートのブランチの差分を見ることができたりします。

```Bash:fetchコマンドの使い方
# リモートのブランチ情報を全て持ってくる
git fetch origin

# 特定のブランチ情報だけを持ってくる
git fetch origin main
```


差分を見るには`diff`コマンドを使います。
```Bash:ローカルとリモートの差分をみる
git diff main origin/main
```

:::note warn
`diff`コマンドについては、次の記事で詳しく解説します。
:::


#### `merge`コマンド
`fetch`コマンドでリモートの情報を持ってこれたら、今度は`merge`コマンドで統合します。

```Bash:mergeコマンドの使い方
git merge origin/main
```

これを実行すると、コンフリクトを起こさない限り、問題なく統合されます。


:::note info
`pull`コマンドは、`fetch`コマンドと`merge`コマンドを統合したコマンド、と言うことだけは覚えておきましょう。
:::

最後に、ここまでのコマンドの挙動について図式化したものを掲載しておきます。ご確認ください。

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/bf41c6c4-4f43-4a0a-8cfc-f3ab748f7bbf.png)



## おわりに
ここまでお疲れ様でした。
ブランチの概念は、初心者にとってかなり難しいですよね。私自身、初心者の頃は全く理解ができず苦戦した分野です。この技術がエンジニアに浸透しきっているのがすごいですよね。こんなわかりにくいのに！

と言うことで次の記事は👇です。

https://qiita.com/ikemura-ren/items/dcdf6dadb11c9a554e1a