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

Ubuntu Git その14 - 3ウェイマージについて・マージの中断とマージコンフリクトについて

3ウェイマージ

  ブランチとブランチをマージする際、各ブランチのコミット状況によっては、ファーストフォワードによるマージを行うことができません。

  このようなマージは、「3ウェイマージ」で行います。

ファーストフォワードできない状況

  「ファーストフォワード」によるマージができない状況です。

  以下のように「master」ブランチと「Ver2」ブランチがあり、「master」ブランチに「Ver2」ブランチをマージしようとしています。


  この時、「master」ブランチのブランチヘッドを単純に移動する「ファーストフォワード」によるマージは行えません。
  そもそもブランチヘッドの移動先がありません。

  これは、「master」ブランチと「Ver2」ブランチが「Commit3」で分岐しており、分岐後(ブランチ後)それぞれ異なる変更内容をコミットしているためです。

  ファーストフォワードは利用できない

    もし無理やり「master」ブランチのブランチヘッドを「Ver2」ブランチに持って行ってしまうと、「Commit5」の変更内容が失われてしまいます。

    逆も然りで、「Ver2」ブランチのブランチヘッドを「master」ブランチに持って行ってしまうと、「Commit4」と「Commit6」の変更内容が失われてしまいます。

    従って、単純なブランチヘッドの移動でマージを行う「ファーストフォワード」が利用できない、ということになります。

  3ウェイマージ(3-Way Merge)

    このような状況でマージを行うと、「Git」は3種類の「スナップショット」を使用して「3ウェイマージ」を行います。

  マージコミット(Merge Commit)

    「3ウェイマージ」を行うと、マージ結果を自動的にコミットします。
    従って、新たに「スナップショット」が自動的に生成されます。

    このコミットのことを、「マージコミット」と表現します。
    「マージコミット」の「コミットオブジェクト」は、複数の「親コミットオブジェクト」を持ちます。

  マージコンフリクト(Merge Conflict)

    変更内容によっては、変更内容が衝突する場合があります。

    例えば、AさんとBさんが同じファイルの同じ行を修正したとします。
    この時、どちらの修正内容を適用(採用)すればいいか、「Git」は判断できません。
    この状況を、「マージコンフリクト」といいます。

    「マージコンフリクト」が発生した場合、「Git」はマージを中断し、ユーザーに判断を委ねます。

    ユーザーは、衝突した変更内容を確認してファイルを修正し、自分でコミットを行います。
    「マージコンフリクト」が発生しなかったファイルは、マージが完了している状態になります。

3ウェイマージによるマージ例

  「3ウェイマージ」によるマージ例です。

  1.ブランチの切り替え

   「master」ブランチに「Ver2」ブランチをマージするため、まず「master」ブランチを作業対象に切り替えます。


  2.マージを行う

    「master」ブランチに「Ver2」ブランチをマージします。
    ここから先は、「Git」がマージ処理を行います。

    「Git」はまず、「master」ブランチと「Ver2」ブランチの共通の「コミットオブジェクト」を探します。
    共通の「コミットオブジェクト」とは、分岐直前のコミットオブジェクトのことです。


    「master」ブランチと「Ver2」ブランチの共通の「コミットオブジェクト」は、「Commit3」であることがわかります。

  3.スナップショットを使用してマージを行う

    「Git」は以下の3種類の「スナップショット」を使用してマージを行います。


  • ブランチ共通の「Commit3」のスナップショット
  • 「master」ブランチのブランチヘッドが指す「Commit5」のスナップショット
  • 「Ver2」ブランチのブランチヘッドが指す「Commit6」のスナップショット

  4.マージ完了

    マージが完了するとコミットが自動的に行われ、「Commit7」が自動的に生成されます。
    「Commit7」のように、マージにより作成されたコミットを、「マージコミット」と表現します。


    これで「Ver2」ブランチの変更内容が、「master」ブランチにマージされました。

    「Commit7」の「親コミットオブジェクト」は、「Commit5」と「Commit6」になります。
    「Ver2」ブランチがもう不要なら、「Ver2」ブランチを削除するとよいでしょう。

マージの中止とマージコンフリクト

  「3ウェイマージ」は万能ではありません。

  もし上記の「4.スナップショットを使用してマージを行う」の段階で、単純なマージができないケースが存在した場合、マージは行われません。


  これを「マージコンフリクト(Merge Conflict)」といいます。
  コンフリクトは、衝突や矛盾という意味です。

  どちらの変更内容を優先すればよいのか分からない

    例えば、「Commit5」と「Commit6」で同じファイルの同じ箇所が修正されている場合、どちらの内容を優先して採用すればよいのか、「Git」は判断することができません。

    「Commit3」の「readme.txt」に以下のテキストが記述されているとします。

今日の天気は晴れです。

    「Commit5」の「readme.txt」に以下のテキストが記述されているとします。

今日の天気は雨です。

    「Commit6」の「readme.txt」に以下のテキストが記述されているとします。

今日の天気は雪です。

    この時「Commit3」の「readme.txt」は、「Commit5」のテキストを採用すればいいのか、「Commit6」のテキストを採用すればいいのか、どちらがユーザーが期待するテキストなのか「Git」は判断できません。

  マージの中止

    マージする際、「マージコンフリクト」が発生すると、マージ処理を中止します。

    「Git」は「マージコンフリクト」が発生したファイルを把握しており、そのファイルには「コンフリクトマーカー(standard conflict-resolution marker)」が挿入されます。

 
    ユーザーは、「マージコンフリクト」が発生したファイルを編集し、自分でコミットを行います。


    これでマージが完了します。
    

Git
スポンサー
コメント
コメントポリシー
コメントをする前に UbuntuのCode of Conduct(CoC/行動規範) を確認し、CoCに沿ったコメントをお願いします。
コメントの使い方は、コメントの使い方を参照してください。
同一カテゴリーの記事
SNS
人気の記事
  • Ubuntu 26.04 その42 - Ubuntu 26.04.1 LTS のリリーススケジュール
    Ubuntu 26.04.1 LTSのリリーススケジュール Ubuntu 26.04.1 LTS のリリーススケジュールを紹介します。
  • Linux Mint その292 - Linux kernel 7.0 採用の Linux Mint 22.3 リリース・システム管理ツールにカーネル管理機能追加など
    Linux Mint 月刊ニュース Linux Mint 開発チームは Linux Mint 月刊ニュースにて、Linux Mint の開発状況や取り組みを紹介しています。
  • Ubuntu 26.04 その68 - Ubuntu 26.04.1 LTS がリリースされました・ディスクイメージのダウンロード
    Ubuntu 26.04.1 LTS リリース 2026年8月27日、Ubuntu 26.04.1 LTS がリリースされました。
  • Linux その422 - GNOME Boxes の再構築と未来・Flatpak のみの提供やモダンな機能の実装など
    GNOME Boxes の再構築と未来 GNOME Boxes の再構築と未来が以下で紹介されています。
  • Kubuntu その117 - Kubuntu 26.04 LTS にもっと手厚いサポートを・最高の信頼性を誇る KDE 搭載ディストリビューションを目指して
    最高の信頼性を誇る KDE 搭載ディストリビューションを目指して Kubuntu 26.04 LTS に手厚いサポートが導入されました。
  • Linux その421 - GNOME Shell のデザイン構想と長期的な見通し
    GNOME Shell のデザイン構想と長期的な見通し GNOME Shell のデザイン構想と長期的な見通しが、以下で紹介されています。
  • Linux その420 - KDE Plasma で実装予定の新機能や改善・UI レイアウトの調整やリモートデスクトップの改善など
    KDE Plasma で実装予定の新機能や改善 KDE Plasma で実装予定の新機能や改善を紹介します。
  • Windows その29 - Windows 向け Coreutils 登場・Coreutils のインストールやコマンドの一覧など
    Windows 向け Coreutils 登場 Windows 向け Coreutils が登場しました。
  • Ubuntu 18.04 その195 - PolicyKitにクラッシュや権限の昇格など複数の脆弱性・今すぐアップデートを
    PolicyKitの脆弱性 2018年7月16日、クラッシュや権限の昇格など複数の脆弱性に対応した「PolicyKit」がリリースされました。
  • Linux その386 - Arch Linux の AUR パッケージで悪意あるコミットが続く・今度はソースコードの難読化か
    Arch Linux の AUR パッケージで悪意あるコミットが続く Arch Linux の AUR パッケージで悪意あるコミット(マルウェア)が続いています。
記事のピックアップ
オプション