gitのrebaseは作業中のブランチにmasterブランチを取り込むためのよい手段 / Git

 gitにはrebaseというコマンドがある。でもまだrebaseコマンドの使う場面を理解していないん人は多いんじゃないかと思う。またrebaseは使い方を誤ると危険だということは本当だけれど、それは使う場面を間違えているのだと思う。

rebaseはいつ使うか

 rebaseはmasterブランチを派生させて作ったブランチ(fooとする)に、masterの新しい変更を取り込みたい場合に使います。

 まず最初にmasterからfooというブランチを作成すると以下のような状態になります。

 *---*---* master
         |
         * foo

 あなたはfooブランチで開発しています。fooブランチはすすんでいきますが、masterブランチも他の開発者の変更を取り込んですすんでいきます。以下のような状態になります。

 *---*---*---*---* master
         |
         *---*---* foo

 でも個々でmasterブランチで行われた変更を取り込みたくなったとします。ここでmasterをマージ(merge)することは避けたほうがよいでしょう。相互にマージしあうのは、コミット履歴をきれいに保つという面ではよくないです。masterがfooをマージするのはOKですが、fooがmasterをマージするのはやめておいたほうがよいでしょう。

 でもfooがmasterの変更を取り込みたいと思うときがあると思います。このような場合にrebaseを使います。rebaseを行うと、面白いことに、masterの先頭にfooブランチを付け替えてくれます。

 *---*---*---*---* master
                 |
                 *---*---* foo

 つまりmasterの先頭を元にしてfooブランチを作って、あなたの一連の変更を加えた状態にしてくれるということです。こうしておくとfooブランチをmasterにマージする作業がきれいに行えます。

rebaseでは競合が発生するときがある

 rebaseでもマージ(merge)をするときと同じように競合が発生することがあります。masterでの変更とfooでの変更がぶつかっている場合は、普通に起こりえることです。こういう場合は競合を解消するようにソースコードを修正してから「git rebase --continue」を行います。

rebaseはコミット履歴を書き換えるので元には戻せない(しにくい?)

 rebaseはコミット履歴を書き換えます。ですから、rebase前に戻るということは、可能であるにしても、行いにくいので、その状態のブランチを一度別名で保存しておくことをおすすめします。

<h3> barを作って</h3>
 *---*---*---*---* master
         |
         *---*---* foo
                 |
                 * bar

<h3> fooをrebase</h3>
 *---*---*---*---* master
         |       |
         |       *---*---* foo
         |       
         *---*---* bar

 これで何か変なことが起こっても元に戻れますね。

rebaseはmasterブランチでは行わないこと

 rebaseはコミット履歴を書き換えます。つまり、コミットの継続性がないということです。masterでrebaseを行ってしまうと、masterを参照している他の人が困ってしまいます。ですからmasterブランチではrebaseは使わないようにしましょう。

 rebaseはブランチで作業する人にとっては、ときどき必要になって、必須で覚えておきたほうがよい機能かと思います。どうやって作業中のブランチにmasterブランチの変更を取り込んだらいいんだって悩む前に覚えておくのがよいでしょう。

rebaseがうまくいかないときはmergeすればよい

 とはいえrebaseしても、ソースコードがごちゃまぜになってしまって、うまくいかないことがときどきあります。そういうときは、コミット履歴よりも修正ができるかどうかという観点のほうが重要ですので、コミット履歴はごちゃっと混ざってしまってもmergeで解決するのがよいでしょう。

関連情報