1. ホーム
  2. ギット

[解決済み】Gitのマージコミットをリベースする

2022-04-07 18:31:36

質問

次のようなケースを想定してください。

トピックブランチで作業をしていて、master にマージする準備ができました。

* eb3b733 3     [master] [origin/master]
| * b62cae6 2   [topic]
|/  
* 38abeae 1

masterからのマージを実行し、コンフリクトを解決して、今に至ります。

*   8101fe3 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
* | eb3b733 3                     [origin/master]
|/  
* 38abeae 1

さて、マージに時間がかかったので、もう一回フェッチしてみると、リモートの master ブランチに新しい変更があることに気づきました。

*   8101fe3 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
| | * e7affba 4                   [origin/master]
| |/  
|/|   
* | eb3b733 3
|/  
* 38abeae 1

もし私が git rebase origin/master を master から取得すると、すべてのコンフリクトを再び解決しなければならず、マージコミットも失われてしまいます。

* d4de423 2       [master]
* e7affba 4       [origin/master]
* eb3b733 3
| * b62cae6 2     [topic]
|/  
* 38abeae 1

マージコミットをリベースして、以下に示すような履歴を作成するきれいな方法はありますか?

*   51984c7 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
* | e7affba 4                     [origin/master]
* | eb3b733 3
|/  
* 38abeae 1

解決方法は?

ここには2つの選択肢があります。

ひとつは、インタラクティブなリベースを行い、マージコミットを編集し、手動でマージをやり直し、リベースを継続する方法です。

もうひとつは --rebase-merges オプションで git rebase というのがあり、マニュアルには以下のように記載されています。

デフォルトでは、リベースは単に todo リストからマージコミットを削除し、リベース後のコミットをひとつの直線的なブランチにまとめます。rebase-merges を指定すると、リベース対象のコミットを再作成してブランチ構造を保持しようとします。 これらのマージ・コミットで解決されたマージ競合や手動修正は、手動で解決/再適用する必要があります。 "