web-dev-qa-db-ja.com

複数のブランチを一度にリベースするにはどうすればよいですか?

私は現在、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内から機能するソリューションにも興味があります。

41
moktor

これを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 'など)にリベースすることです。

25
GoZoner

GoZonerが答えたように、裸のgitコマンドを使用してこれを行う方法はありませんが、さまざまなgit plumbコマンドを組み合わせたスクリプトを通じてこの種のリベースをサポートすることは可能です。

私は実用的な例を書きました、あなたはそれを見つけることができます github上

7
goncalopp

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
5
Coperator

小さなトリックで複数のブランチ/ツリーをリベースできます。

  1. DUMMY_BRANCHを作成します。マスターの場所で
  2. DUMMY_BRANCHに移動するすべてのブランチをマージします
  3. dUMMY_BRANCHを目的の新しいポイントにリベースし、リベースコマンドに_--preserve-merges_オプションを追加します
  4. 手動でリベースした後、リベースされたコミットに分岐します(例:C4 git reset --hard [Commit-hash of C4' (exp1)]
  5. すべてのブランチを移動したら、リベースされたDUMMY_BRANCHを削除します
3
Radon8472