チェリーピックの後リベースしたらどうなるのか試してみた。
- develop ブランチで作業中に、別な作業のために master から topic ブランチを切った
- topic ブランチでは、develop ブランチの変更(コミットC・D)をチェリーピックで取り込んでから、
- 1回コミット(E)
- ここで、develop ブランチの開発が終わったので master にマージ
- 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'は、差分が同じなのでなくなった。