概要
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
$
想定通りとなりました。
リベースは派生元を切り替えるわけなので、派生先のコミット達は軒並み、新規コミットとしてあつかわれることがわかりましたね。。
おつかれさまでした。