Git

Git入門#21(リベースとは)

cocomaru
cocomaru
以前、学習したマージの事は覚えてる?
hiromin
hiromin
うん!ブランチを統合する方法だよね?!
hiromin
hiromin
そうそう、実はもうひとつ統合するやり方に「リベース(rebase)」という仕組みがあるんだ。
リベース? マージとはまた違うの?
cocomaru
cocomaru
うん、言葉で説明するより実際に見た方がわかりやすいと思うから、図で説明するね^^

Gitのリベースの仕組みを知ろう

こんにちは、cocomaruです。

今回はブランチの統合の一つである「リベース(rebase)」について学んでいきたいと思います。

皆さんは以前に学習したマージについては覚えているでしょうか?
忘れてしまった方、または「初めて聞くよ、という方は以下の記事で学習していただければと思います。

Git入門#10(マージをしてみよう) featureブランチのマージの前に…?! どうも、cocomaruです。 今回はマージについて説明していきます。 前回か...

さて早速ですが、リベースとは何か?ですが、リベースとは変更を統合する際に、履歴をきれいにまとめるために使うというものになります。

マージもリベースも同じブランチを統合するものですが、マージは「マージするたびにコミットが新しく作成」されることに対して、リベースは統合してもコミットは作成されません1

ですので作業履歴を綺麗にしたいならリベース、作業履歴を残したいならマージを選択する、と状況によって使い分けていきましょう。

ではここからは図を見て流れを説明していきます。

初期状態

まずは最初の状態として以下の図の通り、ブランチがあるとします。

コミット履歴が1つあって、masterブランチからfeatureブランチを作成した状態です。

各ブランチでコミットを行う

次に各ブランチで新しくファイルを追加したり編集した後、コミットします。

図のようになります。

リベースを行う

次はリベースを行ってみます。

※実際にコマンドを打ちながら学んでいくのは、次回にしたいと思います。今回は流れをみて全体像を把握してください。

上図はfeatureブランチにチェックアウトした後に、「master」ブランチをリベースで取り込んだ後の状態です。
featureブランチのコミットが「Commit’3」と新しくコミット履歴が作成されたことがわかるかと思います。

またfeatureブランチの親ブランチが「Commit1」から「Commit2」のmasterのコミットを指すようになったことがわかりますでしょうか?

これによって、featureブランチにはmasterブランチの情報が統合されました。

masterブランチへfeatureブランチを統合する

さて上記の通りfeatureブランチにはmasterの修正情報が統合はされたことがわかりました。

ここからはmasterブランチにチェックアウトした後、featureブランチの情報をmasterブランチへマージしてみます。

また比較しやすいようにマージした場合と、リベースした場合の違いを図で表示してみましたので、
両方を比較してみてください。

・マージ

新しくマージコミットが作成される

・リベース

featureブランチの親ブランチはmasterブランチのコミットをさしていました。
その為、FastForwardが実行されるので、コミットが新しく作成されることなく統合されました。

また最後に注意点ですが、 リベースするとコミットIDが変更されます
ですので、リモートリポジトリにプッシュした後にリベースを行うとプッシュができなくなりますので、プッシュをした後はリベースを行わないようにしましょう

  • リベースを使うと作業履歴を綺麗にできる
  • リモートブランチにpushした後はリベースしない

さいごに

マージとリベースはブランチを統合することには変更はないですが履歴を含めてみると、だいぶ違うことはお分かりになりましたでしょうか?
次回は実際にコマンドを実践していく予定なのです、よろしくお願いいたします。

Git入門#22(リベースしてみよう) リベースしてみよう こんにちは、cocomaruです。 前回は図でリベースの挙動を確認いただいたかと思いますが、今回は図に沿っ...

  1. 厳密に言うとFastForwardを使用禁止にした場合などはコミット履歴が作成されますが、今回はデフォルトの設定をしていることを前提として説明します。