ブランチとブランチを結合するリベースの基本的な流れ
ブランチとブランチを結合する「リベース」の基本的な流れです。ここでは「リベース」の全体的な作業の流れを見てみます。
1.現在の状況
現在以下のように、「master」ブランチと「fix」ブランチがそれぞれ変更をコミットしています。「fix」ブランチを「master」ブランチに「リベース」しようとしています。
2.ブランチの切り替え
「fix」ブランチのプロジェクトファイル群を確認するため、「fix」ブランチを作業対象に切り替えました。3.リベースを行う
「fix」ブランチを「master」ブランチに「リベース」します。ここから先は、「Git」がリベース処理を行います。
「Git」はまず、「master」ブランチと「fix」ブランチの共通の「コミットオブジェクト」を探します。
共通のコミットオブジェクトとは、分岐直前の「コミットオブジェクト」のことです。
「master」ブランチと「fix」ブランチの共通の「コミットオブジェクト」は、「Commit3」であることがわかります。
4.差分を取る
次に「Git」は、リベース元の「fix」ブランチで行われた各コミットごとに、ファイルの差分を取得します。ここでは、「Commit3」と「Commit4」のファイルの差分を取得します。
ファイルの差分を取得したら、一時ファイルに保存します。
差分は、リベース元の「コミットオブジェクト」ごとに作成されるため、「fix」ブランチに複数の「コミットオブジェクト」がある場合、その「コミットオブジェクト」分、ファイルの差分が作成されます。
5.ブランチのリセットと差分の適用
リベース元の「fix」ブランチをリセットし、リベース先の「master」ブランチに合わせます。「master」ブランチの「ブランチヘッド」 が指す「Commit5」から差分を適用し、コミットを行います。
リベース実行後、「fix」ブランチの「コミットオブジェクト」は破棄され、新規に「コミットオブジェクト」が生成され、「master」ブランチに追加されます。
6.ブランチの切り替え
リベース後、「master」ブランチの「ブランチヘッド」 は、自動的に「Commit6」には移動しません。必要であれば、ユーザーは「ファーストフォワード」によるブランチの「マージ」 を行い、「master」ブランチの「ブランチヘッド」 を移動させます。
「master」ブランチに「fix」ブランチを「マージ」 するため、まず「master」ブランチを作業対象に切り替えます。
7.ブランチのマージ
「master」ブランチに「fix」ブランチを「マージ」 します。「ファーストフォワード」による「マージ」 が行われ、「master」ブランチの「ブランチヘッド」が「Commit6」に移動します。
これで「3ウェイマージ」 した結果と、「リベース」した結果から得られるプロジェクトファイル群は同じになります。
もし「fix」ブランチがもう不要ならば、「fix」ブランチを削除します。
リベースの中断とマージコンフリクト
「3ウェイマージ」 の時もそうでしたが、「リベース」でも「マージコンフリクト」が発生します。「5.ブランチのリセットと差分の適用」で単純な差分の適用ができないケースが存在した場合、「リベース」が一時的に中断されます。
「マージコンフリクト」の時と同様に、コンフリクトが発生したファイルを修正後、「リベース」を続行する必要があります。
もちろん、「リベース」を中止することもできます。
また、その差分の適用をスキップし、次の差分の適用に移ることもできます。