共通のコミットオブジェクトの探索方法について
リベースでは、起点と終点に指定した「コミットオブジェクト」が異なるブランチに属していた場合、それぞれの「コミットオブジェクト」の共通の「コミットオブジェクト」の探索を行う必要が出てきます。共通のコミットオブジェクトとは
共通の「コミットオブジェクト」とは、起点と終点に指定した「コミットオブジェクト」から到達できる同一の「コミットオブジェクト」のことです。例えば、以下のようなブランチがあるとします。
「fix」ブランチを「master」ブランチにリベースする場合、「Commit3」及び「Commit5」から到達できる同一の「コミットオブジェクト」が、共通の「コミットオブジェクト」になります。
上記の場合、共通の「コミットオブジェクト」は、「Commit1」になります。
共通のコミットオブジェクトから、リベース対象のコミットオブジェクトを決定する
リベースでは、共通の「コミットオブジェクト」から、リベース対象の「コミットオブジェクト」を決定します。上記の例では、リベース対象の「コミットオブジェクト」は、以下の「コミットオブジェクト」になります。
- Commit4
- Commit5
共通のコミットオブジェクトの探索方法
共通の「コミットオブジェクト」の探索方法には、以下の2種類の方法があります。- reflogを使用して共通のコミットオブジェクトを探索する
- マージベースを利用して共通のコミットオブジェクトを探索する
探索方法の違いによって何が変わるのか
探索方法の違いにより、リベース対象の「コミットオブジェクト」が変わってきます。シンプルなブランチ構成では、どちらの探索方法でもリベース対象の「コミットオブジェクト」は同じ結果になります。
どちらの探索方法を利用したほうが良いか
基本的にデフォルトのままで良いです。デフォルトでは、どの探索方法が使用されるか
デフォルトで使用される探索方法は、コマンドに指定したオプションにより変わります。reflogを使用するケース
reflogを使用するケースは、以下のいずれかの条件を満たした時です。- --rootオプションが指定された
- コミットオブジェクトの起点を指定した
マージベースを使用するケース
マージベースを使用するケースは、reflogを使用する条件を満たさなかった時です。つまり、以下の全ての条件を満たした時です。
- --rootオプションが指定されていない
- コミットオブジェクトの起点を指定していない
コミットオブジェクトの起点を指定していないということは、必然的にコミットオブジェクトの終点も指定していない、ということになります。
コミットオブジェクトの終点を指定し、コミットオブジェクトの起点を指定しない方法が存在しないためです。
「現在のブランチより後ろにあるリモートトラッキングブランチとリベースする」で紹介した例は、マージベースを使用するケースに該当します。
reflogによるリベース対象のコミットオブジェクトを調べる
reflogを利用した共通の「コミットオブジェクト」の探索方法で、リベース対象の「コミットオブジェクト」がどのようになるのか見てみます。1.ブランチの構成
以下のような構成のブランチがあります。ここでは例として、「fix」ブランチを「master」ブランチにリベースし、「mastsr」ブランチに「fix」ブランチの変更内容を結合します。
各コミットオブジェクトの識別子は、以下のようになっています。
コミットオブジェクト | コミットオブジェクトの識別子 |
---|---|
Commit4 | b3558792781286ca90af046c9318dd9072fe9014 |
Commit5 | 2ce00c397fab7fda134ac653ce9f34c0b9ee005f |
2.コマンドの実行
reflogによるリベース対象の「コミットオブジェクト」を調べるには、以下のコマンドを実行します。
git log <コミットオブジェクトの起点>..<コミットオブジェクトの終点>
「fix」ブランチを「master」ブランチにリベースするため、実際に実行するコマンドは以下のようになります。
git log master..fix
3.コマンドの実行結果
以下のように、リベース対象の「コミットオブジェクト」が出力されます。4.リベース対象のコミットオブジェクト
「3.」で出力された「コミットオブジェクト」の識別子と、「1.」で紹介した「コミットオブジェクト」の識別子から、以下の「コミットオブジェクト」がリベース対象になることがわかります。- Commit4
- Commit5
マージベースによるリベース対象のコミットオブジェクトを調べる
マージベースを利用した共通の「コミットオブジェクト」の探索方法で、リベース対象の「コミットオブジェクト」がどのようになるのか見てみます。1.ブランチの構成
以下のような構成のブランチがあります。ここでは例として、「new」ブランチを「master」ブランチにリベースし、「mastsr」ブランチに「new」ブランチの変更内容を結合します。
各コミットオブジェクトの識別子は、以下のようになっています。
コミットオブジェクト | コミットオブジェクトの識別子 |
---|---|
Commit4 | b3558792781286ca90af046c9318dd9072fe9014 |
Commit5 | 2ce00c397fab7fda134ac653ce9f34c0b9ee005f |
Commit8 | 7a9a22b69ee0dc9fb3721955bf6df9d039d9ecfd |
Commit9 | 14f68399e4c45ba130ff563bc4ddf1a8882bbb0a |
2.マージベースの調査
まず、共通のコミットオブジェクトとなる「マージベース」となるコミットオブジェクトを探します。マージベースは、以下のコマンドで探索します。
git merge-base --fork-point <コミットオブジェクトの起点> <コミットオブジェクトの終点>
「new」ブランチを「master」ブランチにリベースするため、「端末」から以下のコマンドを実行します。
git merge-base --fork-point master new
3.マージベースとなるコミットオブジェクト
以下のように、マージベースが出力されます。出力されている内容は、コミットオブジェクトの識別子です。
4.リベース対象のコミットオブジェクトの調査
マージベースによるリベース対象の「コミットオブジェクト」を調べるには、以下のコマンドを実行します。
git log <マージベース>..<コミットオブジェクトの終点>
「new」ブランチを「master」ブランチにリベースするため、実際に実行するコマンドは以下のようになります。
git log 2537..new
5.リベース対象のコミットオブジェクトの出力
以下のように、リベース対象の「コミットオブジェクト」が出力されます。6.リベース対象のコミットオブジェクト
「5.」で出力された「コミットオブジェクト」の識別子と、「1.」で紹介した「コミットオブジェクト」の識別子から、以下の「コミットオブジェクト」がリベース対象になることがわかります。- Commit4
- Commit5
- Commit8
- Commit9
マージベースの調査とリベース対象のコミットオブジェクトの調査をまとめて行うには
マージベースの調査とリベース対象のコミットオブジェクトの調査をまとめて行うには、以下のコマンドを実行します。
git log `git merge-base --fork-point <コミットオブジェクトの起点> <コミットオブジェクトの終点>`..<コミットオブジェクトの終点>
上記の例では、以下のコマンドを実行します。
git log `git merge-base --fork-point master new`..new