Как можно переустанавливать несколько ветвей одновременно?

В настоящее время я работаю над проектом, в котором SVN используется как репозиторий. Локально я делаю несколько "экспериментов" с кодом, который я не хочу связывать с репо. Поэтому я использую git локально поверх рабочего каталога SVN и использую несколько ветвей для разных "экспериментов". Таким образом, это выглядит, например. как это.

C0 ---- C7 (master)
 \
  \---- C1 ---- C2 ---- C4 (exp1)
   \     \       \
    \     \       \---- C3 (exp2)
     \     \
      \     \---- C5 (exp3)
       \
        \---- C6 (exp4)

На ветке master Я хочу иметь незанятое репо SVN, т.е. C0 является SVN Repo Revision x и C7 является SVN Repo Revision x + n.

Как-то легко можно перегрузить все ветки exp на C7 сразу таким образом, чтобы дерево выглядело следующим образом:

C0 ---- C7 (master)
         \
          \---- C1' ---- C2' ---- C4' (exp1)
           \     \         \
            \     \         \---- C3' (exp2)
             \     \
              \     \---- C5' (exp3)
               \
                \---- C6' (exp4)

Я хочу использовать rebase, так как я не хочу изменять состояние моего локального SVN Checkout и хочу, чтобы мои изменения были построены поверх версий SVN.

Мне также интересны решения, которые работают из SourceTree без использования оболочки.

Ответы

Ответ 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 'в приведенном выше).

Ответ 2

Как ответил GoZoner, нет способа сделать это, используя голые команды git, но это возможно для поддержки такого рода перебазирования через скрипт, который объединяет различные команды git plumbing.

Я написал рабочий пример, вы можете найти его на GitHub

Ответ 3

Я просто хочу упомянуть, что последовательность GoZoner имеет ошибку в первой (и последней) строке. exp1 - это не восходящий exp1, а ветвь, которую вы хотите перебазировать.

Чтобы запустить последовательность, вам нужно иметь master в качестве восходящего потока, то есть мастер git rebase --onto master master exp1 или short, без --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