【GitHub】新しくブランチを切り、編集内容を親ブランチにマージする

# 目的
開発を進めるにあたり、GitHubを使用しています。
チームで開発するにせよ個人で開発するにせよ、1つのブランチでゴリゴリ開発を進めるのではなく、機能ごとにブランチを作成して開発を進めましょう。

+ ブランチについて理解する
+ 新しいブランチを切る
+ 編集内容を現在のブランチにプッシュする
+ 親ブランチにプルリクエストを送る
+ 親ブランチはプルリクエストを受け入れ、編集内容をマージする

:::note
この記事は
 + [新規プロジェクト立上げ時にGitHubにプロジェクトフォルダ全体を共有する方法](https://qiita.com/ysk91_engineer/items/a87f95fbf76018963782)
 + [開発チームに参加し、GitHubからプロジェクトファイルをcloneするまでの流れ](https://qiita.com/ysk91_engineer/items/9eb685619e462a852355)

のシリーズものです。
:::

# 手順

## ブランチについて理解する
開発を開始する前に、ブランチについて理解しましょう。
今回は下記のようなブランチ構成で仕事を進めていきます。
![220723_gitで共有.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/6406d883-7230-6df1-c38e-90e67ec27309.jpeg)

GitHubではフォルダのブランチを作成することで、開発中のデータをマスターデータに上書きしないようにします。
`master`は最終的な実運用に使用するフォルダです。ここからブランチを派生させます。
`development`ブランチはテスト運用に使用するフォルダです。各個人が編集したファイルを集約させ、正しく動作するかを確かめます。**このブランチを[defaultに設定](https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/changing-the-default-branch)します。**
`個人の作業ブランチ`は個人がおこなった作業を保存するファイルです。ブランチ名で作業内用が分かると良いでしょう。
`ローカル`は各個人のPCのことです。

## 新しいブランチを切る

```terminal
# 現在のブランチを確認する(* がついてるのが現在のブランチ)
$ git branch
  * development
    master

# 新しいブランチを作成する
$ git checkout -b hello-A
  Switched to a new branch 'hello-A'

# 現在のブランチを確認すると、新しく作成したブランチに移動している
$ git branch -a
  * hello-A
    development
    master
```

### ブランチを削除する場合は
ブランチを削除する場合は、下記コマンドを実行します。
```terminal
$ git branch -d <ブランチ名>
```


## 編集内容を、現在のブランチにプッシュする

まずはファイルを適当に編集します。
```ruby:application.html.erb
<body>
  <h1>Hello! A</h1> <!-- 編集内容 -->
  <%= yield %>
</body>
```

編集内容を現在のブランチにプッシュします。
```terminal
$ git add .
$ git commit -m "add h1 A"
$ git push -u origin hello-A
```

push先は`origin <ブランチ名>`とします。
教材通りに`origin master`としないことに注意！

## 親ブランチにプルリクエストを送る
変更内容を親ブランチ（今回の場合は`development`)に受け入れてもらうようにお願いすることを**プルリクエスト**を言います。
GitHubに編集内容をプッシュすると、レポジトリ画面に次のような表示がでます。

![スクリーンショット 2022-09-18 9.20.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/3bc6c248-4059-420c-8980-f7356f01b804.png)

`Compare & pull request`ボタンを押すと、編集内容を記入するように求められます。
この欄ではマークダウン方式で記載します。
過去のcommit内容を見ながら書くと、どんな編集をしたかが分かりやすいです。

![スクリーンショット 2022-09-18 9.25.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/bb5af953-7391-73a6-46f1-6f59ad8ea3d2.png)

記載したら`Create pull request`ボタンを押すとプルリクエストの送信が完了です。
レポジトリオーナーのマージを待ちましょう。

![スクリーンショット 2022-09-18 9.27.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/683dc149-59f4-a3db-76d3-5317602af070.png)

## レポジトリ所有者が親ブランチにマージする（プルリクエストを受け入れる）

プルリクエストを受け取ると、下図のようなお知らせが届きます。
`Merge pull request`ボタンを押して、プルリクエストの内容を確認しましょう。

![スクリーンショット 2022-09-18 9.28.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/59e62108-7e8d-3922-9b54-aa3143d822e1.png)

内容を確認したら、`Confirm merge`ボタンを押して編集内容をマージします。

![スクリーンショット 2022-09-18 9.28.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/23e5e688-918a-8b94-ada2-d804335046df.png)

マージが成功すると下図のような表示に変更されます。
古いブランチはもう使わないので`Delete branch`ボタンで削除してしまいましょう。

![スクリーンショット 2022-09-18 9.29.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/b12dab3b-a4a9-5ae1-12a9-251383c3c425.png)

## ローカルのdevelopmentブランチを最新版にする

GitHubの内容をローカルに反映させます。
ターミナルで
```terminal
# developmentブランチに移動する
$ git checkout development
=> ローカルファイルは編集される前の状態に戻る

# ローカルのgitをoriginにある状態に揃える
$ git fetch

# 最新版のdevelopmentブランチをpullして反映させる
$ git pull origin development
```
以上で、ローカル上のファイルが最新版となりました。
以降、また別のブランチを切って開発を進めていきましょう。

# まとめ
以上で新しくブランチを切り、編集内容を親ブランチにマージすることができました。
これまでの3記事で、とりあえず開発を進めることは可能です。
しかし複数人で開発を進めるにあたり、異なるブランチで同一のファイルを編集したときのプルリクはどうなるのでしょうか？

次回は
+ 異なるブランチで同一ファイルを編集したとき(コンフリクト)の対処法

について紹介する予定です。