私は現在、SVNがリポジトリーとして使用されているプロジェクトに取り組んでいます。ローカルでは、レポにコミットしたくないコードを使用していくつかの「実験」を行います。したがって、SVN作業ディレクトリの上にローカルでgitを使用し、さまざまな「実験」のために複数のブランチを使用します。だからそれは例えばこのような。
C0 ---- C7 (master)
\
\---- C1 ---- C2 ---- C4 (exp1)
\ \ \
\ \ \---- C3 (exp2)
\ \
\ \---- C5 (exp3)
\
\---- C6 (exp4)
ブランチmaster
に、汚染されていないSVNリポジトリを用意します。つまり、C0はSVNリポジトリリビジョンx、C7はSVNリポジトリリビジョンx + nです。
ツリーが次の図のようになるように、すべてのexp
ブランチを一度にC7にリベースすることは、どういうわけか簡単に可能ですか?
C0 ---- C7 (master)
\
\---- C1' ---- C2' ---- C4' (exp1)
\ \ \
\ \ \---- C3' (exp2)
\ \
\ \---- C5' (exp3)
\
\---- C6' (exp4)
ローカルSVNチェックアウトの状態を変更したくなく、変更をSVNリビジョンの上に構築したいので、リベースを使用します。
シェルを使用せずにSourceTree内から機能するソリューションにも興味があります。
これを1ステップで取得することはできません。せいぜい、各ブランチを1つずつ移動します。これはシーケンスです:
git rebase --onto master exp1
git rebase --onto c2' c2 exp2
git rebase --onto c1' c1 exp3
git rebase --onto master exp4
重要なのは、古いツリー(上記のc2など)の各分岐点から新しいツリー(上記のc2 'など)にリベースすることです。
GoZonerが答えたように、裸のgitコマンドを使用してこれを行う方法はありませんが、さまざまなgit plumbコマンドを組み合わせたスクリプトを通じてこの種のリベースをサポートすることは可能です。
私は実用的な例を書きました、あなたはそれを見つけることができます github上
GoZonerのシーケンスの最初(および最後)の行に誤りがあることを述べておきます。 exp1
はアップストリームではなく、リベースするブランチです。
シーケンスを開始するには、マスターをアップストリーム、つまりgit rebase --onto master master exp1
または--onto
なしのショートにする必要があります。これはgit rebase master exp1
になります。質問からの例の完全な正しいシーケンスは次のようになります。
git rebase master exp1
git rebase --onto c2' c2 exp2
git rebase --onto c1' c1 exp3
git rebase master exp4
小さなトリックで複数のブランチ/ツリーをリベースできます。
--preserve-merges
_オプションを追加しますgit reset --hard [Commit-hash of C4' (exp1)]