知っていたら実務で最強！　git pullとgit pull --rebaseの違い

# はじめに
Gitの操作でpullはわかってもこのrebaseって何だ？みたいなことが
現場で発生しました。

この記事では***git pullとgit pull -rebaseの違い***について説明していきます。

# git pull --rebaseはどういう場面で使ったのか
自分が現場にアサインされた時に***ブランチのdevelopを切りfeatureブランチを作成した時***に
このgit pull --rebaseを使用しました。

このようなアドバイスを先輩からもらいました。

developをpullする時は

```
$ git fetch
$ git pull --rebase origin develop
```
を使ってとアドバイスをいただきました。

これは***余計なコミットを作らないためだそうです。***

# この記事を書いた理由
なんでこの```--rebase```が使われるのかがわからなかったので、
先輩に記事を紹介してもらい下の参考資料から調べてみました。

するとgit fetch pull merge rebaseの違いをそれぞれ知る必要があると思いました。


# 前提知識
```git pull --rebase``` を理解するには、なんと***fetch、merge、rebase*** の
3つの Git コマンドをちゃんと理解しなければいけません。


### git fetch
***リモート環境の最新情報をローカル環境に反映するコマンド***です。

```
$ git fetch 

$ git fetch origin master　　//リモートのmasterブランチからローカルのorigin/masterブランチへ反映
```

### git merge
***現在いるブランチの内容を他のブランチやmasterなどに反映させるコマンド***です。
***origin/masterからmasterへ最新情報を反映させます***。

```
$ git merge master //masterブランチの内容を今いるブランチにマージしたい時
```
# git rebase
mergeと同じで***今いるブランチに別のブランチの情報を反映させるコマンド***です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/e0bcce20-2148-2ffb-fd81-ad61d5d4aaba.png)

>引用　https://kray.jp/blog/git-pull-rebase/

そして以下のコマンドを使います。

```
$ git rebase master  //今いるブランチを master にリベースしたい時
```
別のブランチにあるふたつのコミットを一時的に保存し別のブランチをリベース先のブランチに 
```git reset --hard(ブランチをmasterと同じ状態にする)``` します。

リセット後の別のブランチの上に一時保存していたコミットを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/00011d18-760e-7f25-1202-39dc8219b7af.png)

>引用　　　https://kray.jp/blog/git-pull-rebase/

***git rebaseだどコミットを新しく作りなおすので、
リベース前とコミットのid と親のid が変わり、master の変更を取り入れ別物になります***。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/6ab6c66c-f059-df50-421f-c5c6a011f64b.png)

>引用　　　https://kray.jp/blog/git-pull-rebase/

### git mergeとrebaseの違い
***git mergeは現在のブランチの別のブランチの情報を取り込みます。***
***git rebaseは取り込みたいブランチの上に今のブランチの内容を反映させます。***


# git pull
***git mergeと　git fetchを同時に行うコマンド***です。
***リモートのmasterブランチからローカルのmasterまで一気に最新情報を反映***させます。

```
$ git fetch
$ git merge origin master
```
これを一括で反映させることができます。

```
$ git pull origin master
```

#### 注意
先輩エンジニアから聞いたのですが、現場で使わない時もあるみたいです。
理由は***もし他でエラーが起きていたら他の人のエラーの分まで取り込んでしまうみたい***です。
(今自分が参画している現場ではpullは普通に使っています。)
基本エラーが起きている状態で反映されることの方が珍しいです。

# git pull --rebase
--rebaseは　```git pullのオプションコマンド```みたいです。
git pullに ***--rebaseオプション***をつけ、```git fetch + rebase```として実行されます。

```
$ git pull --rebase origin master
```
上だと

```
$ git pull --rebase origin develop
```
ですね。

# git pullとgit pull --rebaseの違い
上の先輩から言われたdevelopからブランチを切る時は
***--rebase オプションをつけてプルしたほうがマージコミットが作られないし余計な履歴が
残らず綺麗になるから***でした。

```
$ git pull --rebase origin develop
```

参考資料だと

```
$ git pull --rebase origin master
```
してからプルリクエスト出して欲しいとのことでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/83f39062-c66e-7cb1-6113-efeb1d420b24.png)

>引用　https://kray.jp/blog/git-pull-rebase/

### 注意
```--rabase```のやり方はいろいろ議論があるらしく（ログが綺麗になるけども履歴を書き換えるべきではない」）
などいきなりリベースをするとチームの規約に反する場合もあるみたいで、
チームやプロジェクトによって変わってくるみたいなので、メンバーやリーダーの人などに
相談するといいみたいです。

## 補足(git rebase --abort)
***実行中のリベース操作を中止し、リベース前の状態に戻すコマンド***です。

```
git rebase --abort
```
これによって
1. ***リベース中に作成された一時的なコミットや変更はすべて削除***。
2. ***リベース操作前の状態に戻る***。
3. ***リベースの操作中に変更されたファイルは、元の状態に戻る***。

ここはChatGPTを参照。

### 補足(どういう現場でrebaseを使うのか)
どちらかといえば***小規模開発の方が多い***みたいです。
コミット履歴が比較的少なく、見やすさやくなり管理しやすくなります。


### 参考資料
https://kray.jp/blog/git-pull-rebase/