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

Ubuntu Git その319 - リベースとは・ブランチとブランチを結合するリベースについて

リベース

  前回紹介した「マージ」 では、各ブランチで行われた変更内容を結合して、ブランチの変更内容を別のブランチに結合しました。

  もうひとつ、ブランチの変更内容を別のブランチに結合する方法があります。
  「リベース」です。

  「リベース」には、ブランチとブランチを結合する方法と、特定の「コミットオブジェクト」で行われた変更内容をコピーして、新規に「コミットオブジェクト」を作成し、リベース先に結合する方法があります。

  リベースとは

    簡潔に言えば、既存の変更内容を別の「コミットオブジェクト」に新規に適用することです。
    既存の「コミットオブジェクト」から変更内容を抽出し、その変更内容を別の「コミットオブジェクト」に連結します。
    
    ただし、リベース時に「コミットオブジェクト」は新規に作成されるため、既存の「コミットオブジェクト」と、連結した「コミットオブジェクト」は、変更内容は同じでも別の「コミットオブジェクト」として扱われます。

    この変更内容には、ファイルに対して行った変更内容の他に、コミットメッセージやコミットした日付やコミットしたユーザーの情報など、「コミットオブジェクト」のメタデータも含まれています。

    単純な「コミットオブジェクト」の移動ではない点に留意してください。

ブランチとブランチのリベース

  ブランチとブランチをリベースして変更内容を結合する方法です。
  「リベース」でよく利用される方法です。

  例えば、リポジトリーにブランチが1つ存在するとします。

  そのブランチをブランチすると、リポジトリーにあるブランチが2つになります。
  それぞれのブランチは、以下のように、お互い干渉せずに並行して変更内容をコミットしていくことができます。


  この時「リベース」による変更内容の結合を行うと、リベース元の変更内容をリベース先に連結します。


  上図は、「fix」ブランチを「master」ブランチにリベースした結果です。
  「Commit8」は「Commit6」の変更内容を含んでいます。
  「Commit9」は「Commit7」の変更内容を含んでいます。

  それぞれのブランチで並行してコミットしていた変更内容が、1つのブランチ上で変更内容をコミットしていたかのような結合になります。

  簡潔に言えば、ブランチの連結とブランチの統合です。
  あるブランチで行っていたコミットを、別のブランチでコミットし直します。
 
  ブランチの分岐直後から「ブランチヘッド」までの変更内容が、別のブランチに統合されます。
  この統合される点が「マージ」と大きく異なる点です。

  ただし「リベース」で結合しても、ブランチ自身は削除されません。

  リベースされたコミットオブジェクト

    上図の「Commit8」と「Commit9」は、「リベース」によって生成された「コミットオブジェクト」です。
    このような「リベース」によって生成された「コミットオブジェクト」のことを、「リベースされたコミットオブジェクト」といいます。

コミットオブジェクトは新規に作成される

  リベースを実行すると、リベース先には新規に「コミットオブジェクト」が生成されます。

  上記のブランチのリベースでは、「Commit6」から変更内容を抽出し、その変更内容を元に新規にコミットを行い、「Commit8」を生成しています。

  同様に、「Commit7」から変更内容を抽出し、その変更内容を元に新規にコミットを行い、「Commit9」を生成しています。


  リベースはリベース元で行ったコミットを、リベース先で再実行します。
  変更内容など、リベース元でコミットした内容は引き継ぎますが、「コミットオブジェクト」は別のものになります。

リベース対象になったコミットオブジェクトは破棄される

  リベース実行時、リベース元のブランチに存在する「コミットオブジェクト」は、破棄されます。

  上記のブランチのリベースの例では、「Commit6」と「Commit7」が履歴から削除されます。


  また変更内容は同じでも、「Commit6」と「Commit8」及び、「Commit7」と「Commit9」は異なる「コミットオブジェクト」なので、コミットオブジェクトの識別子は異なります。

  破棄されたコミットオブジェクトは参照できなくなる

    後述しますが、リベースにより破棄された「コミットオブジェクト」は、参照できなくなります。

    もし他に、その破棄された「コミットオブジェクト」を参照しているユーザーがいた場合、そのユーザーは作業を中断せざるを得なくなります。

    他のユーザーと共有しているリポジトリーで「リベース」を実行する時は、この点に注意してください。

  リベース対象になったコミットオブジェクトが破棄されない場合もある

    リベースの方法によっては、リベース対象になった「コミットオブジェクト」が破棄されない場合もあります。

    リベース元のブランチの「ブランチヘッド」が、リベース後に変更されなかった場合、リベース対象になった「コミットオブジェクト」は破棄されません。

すでにリベース先に取り込まれている変更内容はスキップされる

 「リベース」実行時、すでにリベース先に取り込まれている変更内容は、適用がスキップされるため、「コミットオブジェクト」は生成されません。

  従って、スキップされた「コミットオブジェクト」に含まれるコミットメッセージなどのメタデータも反映されません。

  言い換えれば、すでに適用済みとして処理されるということです。

  例えば、以下の構成のリポジトリーがあるとします。
  「Commit2A」と「Commit2B」の変更内容は同じです。


  「fix」ブランチを「master」ブランチにリベースすると、「Commit2B」は「Commit2A」と変更内容が同一であるため、処理がスキップされます。



  「Commit4」の変更内容を元に「Commit4’」を生成してリベースが完了します。

スナップショットはマージもリベースも同じになる

  同一のブランチ構成かつ、同じ内容でコンフリクトの解決を行った場合、マージ完了後の「スナップショット」とリベース完了後の「スナップショット」は、どちらも同じ結果になります。

   どちらの「スナップショット」からプロジェクトのファイル群を取得しても、同じ内容のファイル群が取得できます。

  最新の「スナップショット」のファイル群に違いはありません。

履歴が変わる

  ブランチとブランチを「リベース」すると、履歴が変わります。
  「マージ」では、ユーザーが作成した「コミットオブジェクト」は、そのまま残ります。


  一方「リベース」では、「リベース」対象の「コミットオブジェクト」は全て破棄され、新規に「コミットオブジェクト」が生成されます。


  このように、履歴自体が変わります。


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 へアップグレード可能になりました。
  • Linux その437 - KDE Plasma で実装予定の新機能や改善・オーバービュー効果の改善や Kup の通知機能の改善など
    KDE Plasma で実装予定の新機能や改善 KDE Plasma で実装予定の新機能や改善を紹介します。
  • Ubuntu 26.10 その32 - Snapdragon X2 に対応した Ubuntu 26.10 実験版登場
    Snapdragon X2 に対応した Ubuntu 26.10 実験版登場 2026年9月29日、Snapdragon X2 に対応した Ubuntu 26.10 実験版が登場しました。
  • Ubuntu 26.10 その33 - Ubuntu 26.10 β版がリリースされました・ディスクイメージのダウンロード
    Ubuntu 26.10 β版がリリースされました 2026年10月1日、Ubuntu 26.10 β版 がリリースされました。
  • 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.10 その26 - rust-coreutils へ完全移行・cp/mv/rm コマンドもRust版に移行
    rust-coreutils へ完全移行 Ubuntu 26.10 で rust-coreutils(uutils coreutils)へ完全移行します。
  • Ubuntu 26.10 その28 - Ubuntu Desktop の OOM Killer 設定の見直しとテストの呼びかけ
    OOM Killer 設定の見直し Ubuntu Desktop の OOM Killer 設定の見直しと、テストが呼びかけられています。
  • Ubuntu 26.04 その71 - Linux kernel のアップデート頻度増加へ・毎週アップデートリリース
    Linux kernel のアップデート頻度増加 2026年9月23日、Canonical は Ubuntu 向け Linux kernel のアップデートを毎週リリースする方針をアナウンスしました。
記事のピックアップ
オプション