一般的な場合の問題
私は同様の問題に関心を持っていました: サブヒストリー全体のリベース - いくつかのブランチと、それらの間のいくつかのリンクがマージの結果です:
A--B-B2-B3 <--topicB
\ /
\-C-C2-C3 <--topicC
git rebase
(topicB と topicC に対して)いくつかを連続して実行すると、ブランチ間のマージが正しく保持されるとは思えません。したがって、すべてのブランチを一度にリベースする必要があり、それらの間のマージが正しく再構築されることを期待しています。
特定のサブケースで機能した「ソリューション」
私の場合、topicC
実際にマージされた運がありましたtopicB
:
A-B-----------B2-B3 <--topicB
\ /
\-C-C2-C3 <--topicC
サブヒストリー全体をリベースするには、実行するだけです
git rebase -p A topicB --onto A*
(は、質問のようにA*
ではなく、新しいベースです。は、最初は古いコミット B3 を指し、後で書き換えられたコミットを指すブランチ名です。は、オプションの短い名前です)、次のような履歴を取得します。A
topicB
B3'
-p
--preserve-merges
A-B-----------B2-B3
\ /
\-C-C2-C3 <--topicC
A*-B'-------------B2'-B3' <--topicB
\ /
\-C'-C2'-C3'
次に、残りのすべてのブランチ ref (およびタグ) を新しい対応するコミット (新しいサブヒストリー内) にリセットします。
git branch -f topicC C3'
出来た:
A*-B'-------------B2'-B3' <--topicB
\ /
\-C'-C2'-C3' <--topicC
(ブランチ ref とタグの移動は、おそらくscriptで行うことができます。)
その特定のケースに触発された一般的なケースの「ソリューション」
topicC
にマージされていない場合はtopicB
、偽のトップ コミットを作成して、リベースしたいすべてのブランチをマージできます。
git checkout -b fake topicB
git merge -s ours topicC
そして、そのようにリベースします:
git rebase -p A fake --onto A*
トピックブランチを新しいコミットにリセットし、偽のブランチを削除します。
その他の回答
他の回答も適切で賢明だと思いますが、Gitでの私--committer-date-is-author-date
の経験では、その考えがなく、追加の回答で説明した方法で、リベース後に共有履歴を実際に共有し続けるという問題を解決しましたここ。