Gitのリベースでベースが変更される際に、コミット番号が変わる件を確認する

## 概要

Gitを用いていて、わりとわかりにくい「リベース」について。

developブランチと、ある時点のdevelopから派生したfeatureブランチ(feature/dev_#50としました)があったとします。
developがコミットされて先に進んでしまったときに、あたらしい時点のdevelopからの派生として、feature/dev_#50を **リベース**するシーンがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/468bf39c-e76b-3bcb-205d-854c90d71551.png)

こういうことですね。

**コミット履歴は前のコミット番号を保持する** というGitの性質において、リベースした後のコミットたち(おもに``5d6a09d``,``ef3cd3b``のことです)のコミット番号ってどうなるのかな？ってのを見てみます。

## 前準備

```bash
git init
echo "hello" >> Calc.java
echo "hello" >> Calc2.java
git add Calc.java && git add Calc2.java   && git commit -m 'initial'
git checkout -b develop && git checkout -b feature/dev_#50
```

いま時点の状態を確認します。

```bash
$ git log --oneline --graph
* 39eca7c (HEAD -> feature/dev_#50, master, develop) initial
$
```
develop(``39eca7c``) から feature/dev_#50 がブランチされました。SourceTreeでみるとこうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/e579202f-9699-dfd8-7b73-a76527eccdb9.png)

つづいて feature/dev_#50 に2回コミットしてみます。

```bash
git checkout feature/dev_#50
echo "hello from feature/dev_#50" >> Calc2.java
git commit -a -m '1. modified in dev_#50'

echo "hello from feature/dev_#50" >> Calc2.java
git commit -a -m '2. modified in dev_#50'
```

いま時点の状態を確認します。

```bash
$ git log --oneline --graph
* ef3cd3b (HEAD -> feature/dev_#50) 2. modified in dev_#50
* 5d6a09d 1. modified in dev_#50
* 39eca7c (master, develop) initial
$
```
develop(``39eca7c``) から派生した feature/dev_#50 はいま時点 ``ef3cd3b`` を指しています。

つづいて、develop に1つコミットします。

```bash
git checkout develop
echo "hello from develop" >> Calc.java
git commit -a -m 'modified in develop'
```

いま時点の状態を確認します。

```bash
$ git log --oneline --graph
* f618196 (HEAD -> develop) modified in develop
* 39eca7c (master) initial
$
```

``39eca7c`` を指していたdevelopはいま、``f618196``を指しています。feature/dev_#50 との関係を見るためSourceTreeで見てみると、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/df54856e-d7cd-d5c0-2198-fe2aeb9544bb.png)

- develop は ``f618196``
- feature/dev_#50 は ``ef3cd3b``

を指していることが図からもわかります。

## リベースしてみる。

さてリベースについてです。
リ・ベースとはその名の通り、**最初 ``39eca7c``を指していた develop**、から派生した feature/dev_#50 を、いまの **``f618196``を指しているdevelop** から派生するように切り替えるということです。 図示してみると(最初の図ですが)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/468bf39c-e76b-3bcb-205d-854c90d71551.png)

こういうことです。とするとコミットログは、

4番目:``ef3cd3b`` (feature/dev_#50 のコミット2個目)
3番目:``5d6a09d`` (feature/dev_#50 のコミット1個目)
2番目:``f618196`` (いまのdevelopが指しているコミット)
1番目:``39eca7c``

となるイメージですが、3,4番目の ``5d6a09d``,``ef3cd3b``は、いまのdevelop(``f618196``) からブランチした後の**新たなコミット**となり、新規にコミット番号が振られることになります。

やってみると、、、

```bash
git checkout feature/dev_#50
git rebase develop
```

さあ、いま時点の状態を確認します。

```bash
$  git log --oneline --graph
* d227747 (HEAD -> feature/dev_#50) 2. modified in dev_#50
* 503a3d3 1. modified in dev_#50
* f618196 (develop) modified in develop
* 39eca7c (master) initial
$
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/d4f43fe1-41a6-6f76-43e8-1fe58ffd9fa9.png)

想定通りとなりました。

リベースは派生元を切り替えるわけなので、派生先のコミット達は軒並み、新規コミットとしてあつかわれることがわかりましたね。。

おつかれさまでした。

## 関連リンク

- [SourceTreeで、マージとリベースを行う](https://qiita.com/masatomix/items/07a37ee8d141ceb4fa6f)
- [GitHubのマージとリベースについて](https://qiita.com/masatomix/items/4bdb5f25de632c97f37f)