Git プッシュ後のリベース

# 内容

Gitでプッシュ後にリベースする方法を記載してます。

# 経緯

最近ブランチの共有が何回かありました。

- この部分作ってあるから後よろしくね。という感じでプッシュされたブランチをローカルに落として残りを自分が対応する。※マージはされてない
- 自分が途中まで作ったけど別作業入ったので、プッシュだけして他の人が残りを対応することになったけど、早く終わったので続きを自分が対応する。

など

前までいたPJでは中途半端に作業が終わるのであればきりがいいとこまでやってマージし、残りを他の人が対応という感じでした。
Gitを触り始めたころプッシュ後にリベースやマージをやって別ブランチの変更内容がコミット履歴に入ってきてコミット履歴が見づらいとなったことがあり(あったはず)、プッシュ後のリベース・マージは個人的に抵抗がありました。
対策は1個持ってたのですが、別の方法も気になったので動作確認してみたという感じです。

# そもそもリベースとは

マージは何となくイメージ付くと思います。
ローカルブランチから最新のdevelpブランチを取り込むことで、他の人が変更した内容をローカルブランチにも取り込むことができるという感じです。
リベースはマージしつつ、ローカルのコミットをまとめてくれるというものです。

これが最新を取り込む前の状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/91fbe1bc-04f7-4ad8-b978-db1febba3f75.png)

「コミット」と記載がある場所が最新のmainです。
※developに置き換えてください

1. ブランチA・Bを作成
1. ブランチAで「a-1」コミット
1. ブランチBで「b-1」コミットし、マージ
1. ブランチAで「a-2」コミット

マージだとコミット履歴は下図になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/69f4bc67-0eeb-432d-984e-8708b86ae5a5.png)

リベースだとコミット履歴は下図になります。
※ブランチ名違いますがやってることは最新を取り込む前の状態と同じ内容です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/1bdf9765-15b6-4579-a46c-a46d241b2170.png)

リベースを使うことでローカルブランチ(ブランチX)でのコミットがばらばらにならずに、まとまっているのを確認できます。

## 動作確認

ここからプッシュ後にマージやリベースをしてみます。

### プッシュ後にリベース

1. 最新を取り込む前の状態にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/c80834ec-47a4-4a6f-a294-0f6d471a9d3b.png)

1. ブランチ1をプッシュする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/0a886d1d-b1f3-41bd-9670-d61f3bfc7b6a.png)

1. ブランチ1にいる状態で最新のmainをリベースする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/bb359b33-0f3d-4fc0-b1e9-78e4809394c1.png)

1. ブランチ1をプッシュする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/39aef794-d792-4d5a-9323-02437f1e4644.png)

#### 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/e7ac6634-0ab0-45c0-a5b5-c1ac361fea2a.png)

コミット履歴がよくわからんことになった。

### プッシュ後にマージ

1. 最新を取り込む前の状態にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/6b2ab76a-f119-4d05-81a3-ea23a5daf276.png)

1. ブランチAをプッシュする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/6fde754b-9c70-4b41-9cca-867be7a5a19f.png)

1. ブランチAにいる状態で最新のmainをマージしてプッシュする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/9c999abc-8cfc-4fc1-b709-04493b52b1f2.png)

#### 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/e3eb3607-f04a-40e8-a3b8-4000cb27c2d1.png)

マージのコミットが入ってきた。
期待していたのと違ってた。プッシュ後にマージしたら他の変更差分もブランチa-1コミットみたいに表示されて、ローカルコミットと他ブランチのコミットが混ざってたような記憶があるんだけど、今回みたいにマージしましたよみたいな感じで見やすいコミット履歴ではなかった気がする。あと変更ファイルが1件(x1.txt)になっているけど、記憶だとコミット履歴が混ざるためx2.txtも含まれて2件になるはず。
何かの手順が抜けていたか夢でも見てたのかもしれない。

### プッシュ後にリモートブランチを削除してリベース

1. 最新を取り込む前の状態にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/b77cd34f-3b36-4e86-96df-4d63d03c22ca.png)

1. ブランチXをプッシュする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/034741a5-187e-4674-8ac4-070b0e4fca49.png)

1. ブランチXのリモートブランチ(ローカルでないほうのブランチ)を削除する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/98299db9-0d98-4ca2-b614-e43e3b6cdba4.png)

1. ブランチXにいる状態で最新のmainをマージする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/f92b6c3e-e127-4291-aa22-9202c0f33d4a.png)

1. ブランチXをプッシュする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/4819a55d-c775-4998-9781-ba1f30e4002f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/3e292d78-fa01-46e5-88e2-a87f102e1075.png)

#### 結果

最新を取り込みつつコミット履歴が整理されていて、Github側のプッシュ内容もローカルコミットのみ表示されている。

### プッシュ後にリモートブランチを削除してマージ

#### 結果

普通にマージするのと変わらず

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/628618b3-0cc4-4131-8fca-956558420f8d.png)

### プッシュ後に別ブランチを作成してリベース

1. 最新を取り込む前の状態にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/9ad418fd-9c1e-440c-bccd-9344a836bd51.png)

1. ブランチX1をプッシュする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/c5e2fbc0-d450-4c60-bbf1-516bc0017cb1.png)

1. ブランチX1にいる状態でブランチX2を作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/ed2768ef-6b81-48ba-badf-c1c400021b2c.png)

1. ブランチX2にいる状態で最新のmainをマージしてプッシュする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/4b0205ac-557d-4c8d-981a-54674b0d2b21.png)

#### 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/548fc82d-addd-48ae-afba-64a8526c7f58.png)

コミット履歴がローカルの差分だけ表示される。

# まとめ

プッシュ後にコミット履歴を気にしないならマージ
コミット履歴を気にするならリモートブランチを削除してリベースするか、
プッシュ元の派生ブランチからリベースすることでコミット履歴に他の差分が入らないようになります。

自分は派生ブランチ作成派です。履歴きれいになるし、不要なリモートブランチを最後にまとめて消せるため。