Edited at

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


概要

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

developブランチと、ある時点のdevelopから派生したfeatureブランチ(feature/dev_#50としました)があったとします。

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

こういうことですね。

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


前準備

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

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

$ git log --oneline --graph

* 39eca7c (HEAD -> feature/dev_#50, master, develop) initial
$

develop(39eca7c) から feature/dev_#50 がブランチされました。SourceTreeでみるとこうです。

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

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'

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

$ 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つコミットします。

git checkout develop

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

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

$ git log --oneline --graph

* f618196 (HEAD -> develop) modified in develop
* 39eca7c (master) initial
$

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


  • develop は f618196

  • feature/dev_#50 は ef3cd3b

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


リベースしてみる。

さてリベースについてです。

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

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

4番目:ef3cd3b (feature/dev_#50 のコミット2個目)

3番目:5d6a09d (feature/dev_#50 のコミット1個目)

2番目:f618196 (いまのdevelopが指しているコミット)

1番目:39eca7c

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

やってみると、、、

git checkout feature/dev_#50

git rebase develop

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

$  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
$

想定通りとなりました。

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

おつかれさまでした。


関連リンク