例えば、親ブランチから、作業用のブランチを切って作業していた際に、親ブランチ側に修正が入った結果を作業用ブランチに取り込みたいケースにどうするか。
rebaseとmargeの二つがあるが、微妙に挙動が違う。

という状況だった場合、
■rebase
親ブランチのコミットログがそのまま作業用ブランチに反映される。
$ git checkout experiment $ git rebase master
masterの内容をexperimentに取り込みたい際は、このように必ずexperimentブランチでrebaseを行うこと。

この例だと、experimentブランチのC4ログが削除されて、C4’ログとしてmasterに統合される。
experimentブランチの視点でみると、master側のC3ログが維持されたまま、experimentブランチに反映されていることがわかる。
このrebase後のmasterはC3のままなので、experimentブランチ側のC4’の修正はまだ反映されていない。
なお、親ブランチ側で、うっかり作業用ブランチをrebaseすると、親ブランチのコミットログが消えるので注意。
つまり、
$ git checkout master $ git rebase experiment
とやると、masterのC3コミットログが消えて、experiment側のC4の修正が反映された結果が、masterの内容になってしまい、masterの修正をexperimentに取り込みたいという結果とは逆になってしまう。
つまり、master側が
C0←C1←C2←C4←C3′
となってしまう。
■merge
親ブランチのコミットログが反映されず、マージした結果が一回分のコミットログとして作業用ブランチに反映される。
Subversionのmergeの感覚に近いかも。
こちらの方が罠は少ないがコミットログは追いづらくなる。。
参考:https://blog.codecamp.jp/git_rebase
公式参考:Git-のブランチ機能-リベース
コメントを残す