【初心者向け】gitを正しく使おう。ブランチ作成からマージまでの流れについて

#誰向けの記事か
+ gitを使った開発の初心者
+ gitは使っているけどブランチを切るとかプルリクエストとかマージとかをやったことない人

#背景と実施したこと
個人開発でgitを使っている人は多いと思うのですが、ブランチはきらず淡々とmainにpushし続けるような使い方をしている人も多いのではないでしょうか？
かくいう私もそうでした。
とある方からの指摘で、「せっかくならプルリクやマージもきちんと使った方がチーム開発のノウハウが身についてよい」と助言いただきまして、その流れを再整理しました。

新人教育などにも流用できれば幸いです。

#目次

1. 全体の流れの整理
1. リモートリポジトリの作成
1. ローカルリポジトリの作成、リモートへのpush
1. mainからのfeatureブランチの作成
1. ブランチ間の差分確認、プルリクエスト作成
1. mainへのマージ
1. 最後に

##全体の流れの整理

目次がそのまま全体の流れになっていますが、以下のような流れでgitを活用することが多いと思います。

**１、 リモートリポジトリの作成**
github上でリモートのリポジトリを作ります。
UIの操作で完結するのでそこまで苦労することはないでしょう。

**２、 ローカルリポジトリの作成、リモートへのpush**
ローカルのリポジトリを作成し、それをgithub上で管理しているリモートリポジトリにpushします。
開発をする上では最低限ここまでしておけば、ソースをクラウドで管理することはできるのですが
チームメンバーが2人以上の場合、これでは分散して作業ができないのでつらいです。

**３、 mainからのfeatureブランチの作成**
ベースとなるのはmainとよばれるリポジトリ（昔はmasterだった）
ですが、これに対して直接pushするのは基本避けましょう。
実際の開発作業はmainから切り出したfeatureブランチで行います。
featureで行った改善内容をリモート先（github）のリポジトリにpushします。

**４、ブランチ間の差分確認、プルリクエスト作成**
featureとmainで差分が出ることになるのでこれを確認します。
問題ない内容だと確認できれば、プルリクエスト（更新内容を反映してほしい旨の依頼）を作成します。

**５、mainへのマージ**
（通常第三者が）コードの中身、差分を確認してgithub上でマージを行います。

以下で詳細を記述します。

##リモートリポジトリの作成
githubの画面からまずはリモートのリポジトリを作成します。
画面での操作で完結するのであまり難しい点はないです。
公開範囲をPublic（インターネット上に公開するか）にするかPrivate（自分や特定のユーザのみ）にするかの選択は間違えないようにしましょう。
下部のチェックボックスで「README」や「.gitignore」というファイルを作成するかどうか聞かれますが
わからない場合は空白のままでOKです。（後で必要であれば追加できます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/94f0666e-20dc-4388-a211-a418beb922d6.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/b7f71fef-0c38-12ea-1a62-537ffb700122.png)


##ローカルリポジトリの作成、リモートへのpush
今度は自分のローカル環境に作業を移します。
対象のdirに移って、以下のような流れでローカルのソースをリモート先へPush（反映）します。

```
git init 
(gitの初期化　これでローカルにリポジトリができる）

git config user.email XXXXXXX
git config user.name XXXXXXX
(githubの認証に使うメアド、ユーザ名の設定)

git remote add origin XXXXXX(github上のリポジトリ)
(ローカルのリポジトリとリモートとの紐づけ)

git add .
(コミットする対象のファイルを選択)

git commit  -m "first commit"
(コミット)

git push -u origin main
(mainへのpush)

```

##mainからのfeatureブランチの作成

開発作業は以下のような流れでmainからブランチを切り出して行います。

```
git branch feature/dev1(/以降は任意の名称、ここでは「dev1」)

git checkout feature/dev1
(mainからdev1へ作業するブランチを切り替え)

何かしらのコード変更を行った後
git add .
git commit -m "message" 
git push origin feature/dev1

```

##ブランチ間の差分確認、プルリクエスト作成
この時点でmainとdev1ではコードに差分があります。
これに対して、「この変更をmainに反映してください」と依頼を出すのがpull requestです。
githubの画面右上から行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/d46da9f0-c1f3-293b-f7bd-7d10d77b7358.png)


##mainへのマージ
中身を確認して問題なければマージを行います。
コードのconflict（競合）があればここでわかるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/a8231740-d4f9-a2b9-ec27-887e8177e613.png)

マージが問題なく完了すると、以下のように「Merged」になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/fde17a37-55a8-a02d-765f-856e9aa14a0b.png)

その後、ローカルでの開発に戻ります。
mainにマージされた最新のソースを反映する必要があるので、以下のようにmainにpullします。
その後、再度dev1に切り替えるor別のブランチを作成するなどして開発を続行します

```
git switch main
or
git checkout main

git pull
```

##おまけ(「上流ブランチはありません」とVSCodeに怒られたときは…)
コマンドラインではなくVSCodeのUI上でgitを操作することもできます。
今回feature/dev1のブランチのpushをUI上から行うとすると
「上流ブランチはありません。このブランチを公開しますか？」
とアラートが出ました。

コマンドライン上は、pushする際に「origin feature/dev1」を明示しているが、UI上ではその判断ができていないようです。

以下のコマンドで設定できるのでアラートが出た人は試してみてください。

```
■上流ブランチの確認
git branch -vv　

■上流ブランチの設定
git branch <ローカルブランチ名> -u <リモートブランチ名>

今回の例だと
git branch feature/dev1 -u origin/feature/dev1
```


##最後に
gitにまだまだ慣れていない初心者の人は上記をぜひ参考にしてみてください！