猫でも分かるgit rebaseの使い方

どうも、せっきーです。

gitを使い始めてからはや4年。
よく使われる一通りのgitコマンドは使いこなせる様になったかと思いきや、git rebaseはずっと苦手で、ずっとなあなあにして来ました。




git rebaseは言ってしまえばgitのコミットログをキレイにする為のコマンドなのですが、イマイチその有用性を実感できず、最近までひとつのプルリクにいくつもログが残ったままpushしておりました。

しかしこのままではいかんと思い、このたびgit rebaseをマスターすべく勉強してみました。




git rebaseを理解しようとして挫折する人の一番の壁は、コンフリクトした際に「no branch」に飛ばされてしまう現象じゃないかと個人的には思います。


実際にターミナルの画面を見ながら解説します。
まずは普通の成功例。

こんなログのブランチがあったとします。






例えば修正Bと修正Cのログをひとつにまとめたいと思った場合のコマンドは、

1
git rebase -i HEAD~2

になります。
実際に打ってみます。

するとこんな画面になりますので、
ベースとなるコミットにpick、他とまとめたいコミットにsquashを入力し、

:wqで保存します。すると、

コミットメッセージ編集画面になりますので、1行にまとめて、

同様に:wqで保存します。
すると、

こんな感じでひとつのコミットにまとめられました。

しかしたまにこんな感じのエラーが出て…

この様に(no branch)と言う謎のブランチに飛ばされる事があります。

これはrebaseする事によりコンフリクトが起こる為、自動的にマージ出来ない場合に起きます。

そうなった場合は冷静にコンフリクトしているファイルを確認してそのファイルのコンフリクトを解消して、

1
git add

そして通常ならこのままgit commitしたくなりますが、そうではなく、

1
git rebase --continue

と打ちます。
こうする事でコンフリクトを解消した上で、rebaseできます。

そしてブランチの位置もno branchではなく、元いたブランチに戻って来てます。

さて、ここまででコミットログをキレイに出来たのですが、いよいよコミット結果をリモートブランチにpushしたいのですが、普通に

1
git push origin (hoge)

と打っても以下の様なエラーになります。

なのでここでは-fコマンドを使いましょう。

このオプションは上記エラーがあっても強制的にpushするコマンドなので、自分以外が触っている可能性があるブランチでは使わない様に。

以上、git rebaseのやり方とつまづきドコロでした。