Open1

[Git] 多段派生したブランチA->B->CのうちAに対してCのコミットのみをマージしたあとでAにBをマージする

PINTOPINTO
Git において、Aブランチから派生したBブランチがpush済みのときに、
Bブランチから更にCブランチを派生して生成したあとで下記のことが可能か知りたいです。

1. Aブランチに対してCブランチのコミットのみをマージする
2. 1のあとしばらくしてからBブランチのコミットをAブランチにマージする

Git では、Aブランチから派生した B ブランチに加え、さらに派生した C ブランチについて、以下のような操作を行うことが可能です。


1. Aブランチに対してCブランチのコミットのみをマージする

可能です。
C ブランチが A ブランチまたは B ブランチから派生したものであっても、Git はコミットの単位でマージを処理します。以下の手順で進められます:

  1. CブランチをAブランチにマージ
    git checkout A
    git merge C
    
    • この操作により、C ブランチのコミットが A ブランチに取り込まれます。
    • コンフリクトが発生した場合は解決が必要です。

2. 1のあとしばらくしてからBブランチのコミットをAブランチにマージする

これも可能です。
ただし、C ブランチの変更が B ブランチにも影響している場合、マージ順序によってはコンフリクトの解消が必要になることがあります。

操作手順

  1. BブランチをAブランチにマージ
    git checkout A
    git merge B
    
    • Cブランチで既に取り込んだ内容が A に存在する場合、Git はそれを認識して差分のみを適用します。
    • コンフリクトが発生した場合は解決してください。

注意点

  1. CブランチのコミットがBブランチに含まれる場合の影響

    • B ブランチを A ブランチにマージするとき、C ブランチで既に取り込んだ内容がダブらないように自動的に処理されます。
    • そのため、重複マージによる問題は通常発生しません。
  2. 順序に注意

    • 先に C ブランチをマージしても、後から B ブランチをマージする際に問題なく取り込むことができます。
    • ただし、B ブランチで C ブランチと競合する内容がある場合、コンフリクトが発生します。
  3. 不要な履歴を減らしたい場合

    • 必要に応じて --squash オプションを使うと、特定のコミット群をひとつにまとめてマージできます。
      git merge --squash C
      
  4. より明確な履歴管理

    • マージ履歴をきれいに保つため、rebase を活用しても良いでしょう。
      例: C ブランチを A にマージする前に A の最新状態を取り込む。
      git checkout C
      git rebase A
      git checkout A
      git merge C