kledgeb Ubuntuの使い方や日本語化、アプリの使い方を紹介しています。 Ubuntuの最新情報も紹介しています。

共通のコミットオブジェクトの探索方法について

  リベースでは、起点と終点に指定した「コミットオブジェクト」が異なるブランチに属していた場合、それぞれの「コミットオブジェクト」の共通の「コミットオブジェクト」の探索を行う必要が出てきます。

  共通のコミットオブジェクトとは

    共通の「コミットオブジェクト」とは、起点と終点に指定した「コミットオブジェクト」から到達できる同一の「コミットオブジェクト」のことです。

    例えば、以下のようなブランチがあるとします。  


    「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



関連コンテンツ
同一カテゴリーの記事
コメント
オプション