kledgeb UbuntuやLinuxの最新情報を紹介

Ubuntu Git その368 - 共通のコミットオブジェクトの探索方法について(git rebase)

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

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

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

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

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


    「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



Git
スポンサー
コメント
コメントポリシー
コメントをする前に UbuntuのCode of Conduct(CoC/行動規範) を確認し、CoCに沿ったコメントをお願いします。
コメントの使い方は、コメントの使い方を参照してください。
同一カテゴリーの記事
SNS
人気の記事
  • Ubuntu 24.04 その104 - Ubuntu 26.04 LTS へアップグレードするには・アップグレードの注意事項
    Ubuntu 26.04 LTS へアップグレードするには 現在 Ubuntu 24.04 LTS を利用しているユーザーは、Ubuntu 26.04 LTS へアップグレードできます。
  • Ubuntu 26.04 その74 - Chromium 系ブラウザーにより、Qt6 で構築されたアプリがクラッシュする現象
    Qt6 で構築されたアプリがクラッシュする現象 Chromium 系ブラウザーにより、Qt6 で構築されたアプリがクラッシュする現象が報告されています。
  • Ubuntu 24.04 その103 - Ubuntu 26.04 LTS へアップグレード可能に・2年分の変化が一気にやってくる
    Ubuntu 26.04 LTS へアップグレード可能に 2026年9月29日、Ubuntu 24.04 LTS から Ubuntu 26.04 LTS へアップグレード可能になりました。
  • Ubuntu 26.10 その33 - Ubuntu 26.10 β版がリリースされました・ディスクイメージのダウンロード
    Ubuntu 26.10 β版がリリースされました 2026年10月1日、Ubuntu 26.10 β版 がリリースされました。
  • Ubuntu 26.10 その32 - Snapdragon X2 に対応した Ubuntu 26.10 実験版登場
    Snapdragon X2 に対応した Ubuntu 26.10 実験版登場 2026年9月29日、Snapdragon X2 に対応した Ubuntu 26.10 実験版が登場しました。
  • Linux その437 - KDE Plasma で実装予定の新機能や改善・オーバービュー効果の改善や Kup の通知機能の改善など
    KDE Plasma で実装予定の新機能や改善 KDE Plasma で実装予定の新機能や改善を紹介します。
  • Ubuntu 24.04 その102 - Ubuntu Desktop 24.04.5.1 がリリースされました・ディスクイメージのダウンロード
    Ubuntu Desktop 24.04.5.1 がリリースされました 2026年9月15日、Ubuntu Desktop 24.04.5.1 がリリースされました。
  • Ubuntu 26.04 その71 - Linux kernel のアップデート頻度増加へ・毎週アップデートリリース
    Linux kernel のアップデート頻度増加 2026年9月23日、Canonical は Ubuntu 向け Linux kernel のアップデートを毎週リリースする方針をアナウンスしました。
  • Linux その440 - uutils coreutils 0.11.0 でコマンド実行時のエラーメッセージを大幅に改良
    コマンド実行時のエラーメッセージを大幅に改良 uutils coreutils 0.11.0 で、コマンド実行時のエラーメッセージが大幅に改良されました。
  • Ubuntu 26.10 その26 - rust-coreutils へ完全移行・cp/mv/rm コマンドもRust版に移行
    rust-coreutils へ完全移行 Ubuntu 26.10 で rust-coreutils(uutils coreutils)へ完全移行します。
記事のピックアップ
オプション