40

git以下の歴史を考えると:

    C-I    origin/master
   /
A-B-F-G-H  master
 \   /
  D-E      branch-b

masterローカルブランチを の上にリベースしorigin/masterたいが、マージ コミットは保持したいGgit rebase origin/master単純にちょっとやってみたらのコミットメッセージでmasterつぶれD..EGコミットしてEしまったので、マージした履歴が消えてしまいました。リベースを取得しながら、このマージを保持する方法はありますか? 明確にするために、私の意図した結果は次のとおりです。

A-B-C-I-F-G-H  master
 \       /
  D-----E      branch-b
4

2 に答える 2

62

--preserve-mergesリベースコマンドに追加します。マージで競合が解決された場合は、パラメーターとして「再帰的theirs」戦略も追加します。

編集:--preserve-merges非推奨になりました。--rebase-merges代わりに使用してください

于 2011-06-03T01:07:08.203 に答える
2

これはあまりきれいではありませんが、できると思います。

F を新しいマスター ブランチとして origin/master にリベースします。

git checkout F
git checkout -b new_master
git rebase origin/master

branch-b を新しいブランチにマージします。

git merge branch-b

残りの H コミットを新しいマスター ブランチにチェリー ピックします。

git cherry-pick master

古いマスター ブランチを削除します。

git branch -D master

残念ながら、再度マージを行う必要があります (うまくいけば、手動でマージする必要はありません)。

私は実際にこれを試していないので、最初にリポジトリのバックアップを作成しますが、必要なものが得られると確信しています。また、変更内容を確認できるように、各コマンドの後に gitk --all を開き、「F5」でツリーを更新することをお勧めします。

よりエレガントな方法を知っている場合は、他の誰かが投稿する必要があります。

于 2011-06-03T00:07:50.983 に答える