【Git】いくらGUIといえど、マージのオプションくらい知っておこうよ

## 導入
私は普段Gitの操作にvscodeのGitGraphとGitLensを使用しています。
GUIで`merge`をしたときに`Modal`ででてくるオプションの意味も深く理解しておらず、GUIの安心感に甘えて`merge`の操作をしていました。
![スクリーンショット 2023-06-18 16.29.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334980/f57aeff5-a44b-d6cf-a9a9-08449cf19fec.png)

CUIで1から学ぼうと思っても学習コストのハードルが高い、、
そこで、GUIでのオプションくらいは理解しておこうと思い今回まとめようと思いました。

少し長いので、結論だけ知りたい人は「まとめ」まですっ飛ばしてください。

## 賢い方はこちら

| オプション名                                               | 目的                                                           | 利点                                                                                                 | 使用例                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
|--------------------------------------------------------|----------------------------------------------------------------|------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| "Create a new commit even if fast-forward is possible" | ファストフォワードを避けてマージコミットを作成できる。 | - マージの履歴が明確になり、ブランチの変更履歴を管理できる。<br>- 新しいコミットが作成されるため、マージを元に戻すことが容易になる。 | - ブランチ間の変更履歴を明確に保ちたい場合。<br>- マージした変更を簡単に元に戻せるようにしたい場合。                                                                                                                                                                                                                                                                                                                                                                          |
| "Squash Commits"                                        | ブランチのコミット履歴をシンプルにすること。              | - ブランチの履歴が見やすくなる。<br>- コミット数を減らる。<br>- マージ先のブランチの履歴が煩雑になりにくい。           | - 開発中のブランチで行った複数のコミットをまとめたい場合。<br>- マージ先のブランチの履歴をスッキリさせたい場合。                                                                                                                                                                                                                                                                                                                                                         |
| "No Commit"                                             | マージコミットを作成せずに変更を取り込める。              | - マージコミットを作成せずに変更を取り込むことが可能。<br>- コミットを作成せずにブランチの履歴をすっきりさせられる。           | - マージ先のブランチに変更を取り込みたいが、マージコミットを作成したくない場合。<br>- 一時的な修正やブランチの統合など、一時的な変更を履歴に残したくない場合。                                                                                                                                                                                                                                                                                                            |

## さっきので難しい人はこちら
なるほど。
いや、むずかしいですね。少なくとも業界8ヶ月の自分には理解が追いつきません。
AIに頼りながらもう少し、深くまとめていきます。

### "Squash Commits"と "No Commit"について
こちらは、比較的理解しやすいと思います。
いまいちオンにする使うパターンが思いつきませんが、
どちらも適宜オンにするような運用をした場合、以下のメリットがあると思います。
- 各ブランチでのコミット数を省略したい場合。
- ログにマージのコミットを出したくない場合。
GUIでGraphを見ている自分としては、どちらも使わないオプションなきもしています。（使い方がわかっていないだけかも。）

### "Create a new commit even if fast-forward is possible"について
これちょっとむずかしいですよね。
具体的に、このオプションを「オン」にする場合と、「オフ」にする場合についてまとめてみました。
#### 「オフ」の場合
- マージコミットがでない。
ブランチの変更が直接マージ先のブランチに反映されるため、マージコミットが不要な場合に使用する。
- ログやグラフをパッと見た場合、どのブランチで作業したコミットなのかわからない。
- コンフリクトが発生した場合は、`if`が通らないので、マージコミットができる。

#### 「オン」の場合
- マージが明示的に表示される。
- どのブランチで作業したかがわかる。

個人的にですが、共同開発で同じ箇所を触る場合のコンフリクトが多発しそうな場合はマージコミットを残す必要がありそうですが、そんな場面ってかなり限定的な場面な気がしています。
## まとめ
基本的に、全部オフでよさそうですね。