Как можно переустанавливать несколько ветвей одновременно?
В настоящее время я работаю над проектом, в котором 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