Gitのブランチとマージについて(git branch, git merge)

# この記事を書くきっかけ
Gitについて勉強している初心者です。Gitを使いこなせるようになりたくて勉強しています。一人で開発をしているだけで、まだ複数人での開発に携わったことがないのですが、将来のためにGitのブランチやマージについて調べてみました。

あと、下記のサイトがわかりやすかったので、是非参考にしてみてください。

https://backlog.com/ja/git-tutorial/stepup/01/

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%81%AF

# ブランチを作る(git branch)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642333/8dcc7354-7b49-8cc6-a3cf-d6db550ae6bd.png)

### ブランチとは【What】
同じリポジトリ内で並行して異なる作業をしたいときに、作業を別々に管理するための機能を「ブランチ」と言います。新しい「ブランチ」を作ることでGitに記録する履歴を枝分かれさせ、その「ブランチ」を任意のタイミングで元のブランチに統合することもできます。それを「マージ」を呼びます。

Gitのリポジトリを作成すると、自動でmasterブランチが作られます。並行作業のために他の「ブランチ」で作業をしても、多くの場合最終的にはmasterブランチに「マージ」を行います。

### なぜブランチが必要なのか【Why】
masterブランチは主となるブランチです。間違った内容をコミットするわけにはいきません。そのため、作業用のブランチを作り、変更内容に誤りがないか確認したり、新機能の検証を行ったりして問題がなければmasterブランチに「マージ」するという方法を取ります。masterブランチが道路で言う本線、その他のブランチが支線で、そのうち本線に合流するというイメージでしょうか。

### ブランチの作成方法【How】
ブランチを作成するコマンド
`git branch <作成するブランチ名>`


ブランチを切り替えるコマンド
`git checkout <切り替えるブランチ名>`

使用中のブランチを確認するコマンド
`git branch`

### ブランチの種類

Gitにおけるブランチには、さまざまな目的に応じた種類があります。一般的なブランチの種類とその目的について説明します。

1. Masterブランチ
目的: 本番環境にデプロイされる準備ができたコードを保持する。
特徴: 最も安定したバージョンのコードが含まれる。通常は直接コミットせず、他のブランチからのマージを通じて更新される。

2. Developブランチ
目的: 開発中のコードを統合するためのブランチ。
特徴: 各種機能ブランチや修正ブランチからの変更が統合される。次のリリース候補のコードが含まれる。

3. Featureブランチ（トピックブランチ）
目的: 新しい機能の開発を行うためのブランチ。
特徴: 特定の機能追加や改善のために作成される。開発が完了したら、Developブランチにマージされる。

4. Releaseブランチ
目的: 新しいリリースの準備を行うためのブランチ。
特徴: リリース前のバグ修正やドキュメント更新を行う。リリースが完了したら、MasterブランチとDevelopブランチにマージされる。

5. Hotfixブランチ
目的: 緊急のバグ修正を行うためのブランチ。
特徴: プロダクション環境で発生した重大な問題を即座に修正する。修正が完了したら、MasterブランチとDevelopブランチにマージされる。

6. Bugfixブランチ
目的: 開発中のバグ修正を行うためのブランチ。
特徴: 特定のバグ修正を目的として作成される。
修正が完了したら、Developブランチにマージされる。


# 作成したブランチをマージする(git merge)
### マージの方法
作成したブランチをマージするには、通常のマージ方法、スカッシュマージ、リベースの3つの方法があります。

今回はトピックブランチ(特定の作業や変更のために一時的に作成されるブランチ)をmasterブランチにマージする想定で、その方法を説明します。

### 1. トピックブランチのすべてのコミットをそのまま保持する（通常のマージ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642333/3208c1e3-5ea4-da87-548c-7c3f0b8ec8a3.png)

最も基本的なマージ方法です。トピックブランチのすべてのコミットをそのまま保持して、masterブランチに統合します。

**手順**
masterブランチに切り替える
`git checkout master`
masterブランチを最新の状態に更新する
`git pull origin master`
トピックブランチをマージする
`git merge <トピックブランチ名>`
変更をリモートリポジトリにプッシュする
`git push origin master`

### 2. トピックブランチの前コミットを1つにまとめる「スカッシュ」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642333/d981735d-58ef-bb44-ab8b-a97e47855f8f.png" width="600">

スカッシュマージでは、トピックブランチの複数のコミットを1つにまとめてからマージします。これにより、コミット履歴が簡潔になります。

**手順**
masterブランチに切り替えてマージする
`git checkout master`
`git merge --squash <トピックブランチ名>`
変更をリモートリポジトリにプッシュする
`git push origin master`

### 3. masterブランチのコミット履歴を一直線にする「リベース」

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642333/e82a5e0c-7241-922c-b3d2-8952468189bd.png" width=80% ;>

リベースを使用すると、トピックブランチの変更をmasterブランチの最新のコミットの上に再適用します。これにより、コミット履歴が直線的になります。

**手順**
トピックブランチに切り替える
`git checkout <トピックブランチ名>`
masterブランチの変更をリベースする
`git rebase master`
masterブランチに切り替えてマージする
`git checkout master`
`git merge <トピックブランチ名>`
変更をリモートリポジトリにプッシュする
`git push origin master`

マージが完了したら、不要になったトピックブランチを削除することができます。

ローカルブランチを削除する
`git branch -d <トピックブランチ名>`
リモートブランチを削除する
`git push origin --delete <トピックブランチ名>`

# まとめ
ブランチとは、masterブランチと並行して他の作業を行うための機能。また、独立した作業単位そのもの。新しい枝（ブランチ）。
他のブランチのコードに影響を与えることなく作業を進めることができる。また、複数の開発者が同時に異なる機能やバグ修正に取り組むときにとても便利。

マージとは、枝分かれしたブランチの変更をmasterブランチに統合する操作。用途に応じて、３種類の方法がある。

1. 通常のマージ
「全てのコミットをそのまま残し、履歴を統合する。」
2. スカッシュマージ
「複数のコミットを1つにまとめてから統合する。」
3. リベース
「履歴を一直線にしてから統合する。」

今回勉強して、ブランチとマージについて簡単に知ることができたので、
新しいブランチを作って、作業して、マージして、元のブランチを削除するという一連の作業を自分でも試してみたいと思います。