Git チェリーピックとリベースの練習

チェリーピックの後リベースしたらどうなるのか試してみた。

  1. develop ブランチで作業中に、別な作業のために master から topic ブランチを切った
  2. topic ブランチでは、develop ブランチの変更(コミットC・D)をチェリーピックで取り込んでから、
  3. 1回コミット(E)
  4. ここで、develop ブランチの開発が終わったので master にマージ
  5. topic ブランチをプッシュするために master に対してリベースする

という想定。

3 の時点ではこんな感じ。

master A - B 
           |\
develop    | C - D
            \
topic        C'- D'- E
$ git log --all --graph --oneline
* afae91d (HEAD -> topic) コミットE
* a28d690 コミットD
* c54edde コミットC
| * 5837dee (develop) コミットD
| * 57d1d91 コミットC
|/  
* f1b31ed (master) コミットB
* 5e7d9a6 コミットA

topic ブランチの コミットCとコミットDは、develop ブランチからチェリーピックしたものなので、コミットのハッシュは異なっている。

次に、develop ブランチを master にマージ。

$ git checkout master
Switched to branch 'master'

$ git merge develop
Updating f1b31ed..5837dee
Fast-forward
 hello.txt | 2 ++
 1 file changed, 2 insertions(+)

$ git log --all --graph --oneline
* afae91d (topic) コミットE
* a28d690 コミットD
* c54edde コミットC
| * 5837dee (HEAD -> master, develop) コミットD
| * 57d1d91 コミットC
|/  
* f1b31ed コミットB
* 5e7d9a6 コミットA

すると、早送りマージされ、上のようなコミットグラフになる。

そして、最後に topic ブランチを master にリベース。

$ git checkout topic
Switched to branch 'topic'

$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: コミットE

$ git log --all --graph --oneline
* 8578c21 (HEAD -> topic) コミットE
* 5837dee (master, develop) コミットD
* 57d1d91 コミットC
* f1b31ed コミットB
* 5e7d9a6 コミットA

こんな感じで一直線の履歴になった。

リベースはチェリーピックと同様コミット間の差分(パッチ)を当てていくので、コミットEだけが残った形になった。コミットCとコミットDのハッシュは、developと同じまま。develop からチェリーピックしたC'とD'は、差分が同じなのでなくなった。