Восстановить только часть ветки
У меня две ветки (и мастер). Филиал 2 основан на Филиале 1 на основе мастера. Я отправил отчет 1 для обзора, у него были некоторые изменения, я переустановил некоторые из этих изменений в историю и объединил результат в мастер.
Теперь мне нужно переустановить Branch 2 на вершине мастера, чтобы подготовить его для просмотра/слияния.
Проблема в том, что Branch 2 все еще содержит исходные коммиты Branch 1, которые больше не существуют, поэтому git запутывается. Я попробовал rebase -i, чтобы удалить исходные коммиты Branch 1, но фиксации Branch 2 не основываются на вершине master-before-branch-1.
Что мне нужно сделать, это взять ветвь 2, сбросить некоторые коммиты и переустановить только оставшиеся фиксации поверх мастера за одну операцию. Но я знаю только, как делать эти две операции в двух разных шагах.
Как я могу переустанавливать часть моей ветки на другую ветку, отбрасывая все коммиты, которые не являются общей родословной, кроме тех, которые я указываю (например, от HEAD ~ 2 вверх)?
Здесь текущее состояние:
master new branch 1
- - - - - - - - - - - | - - - - - - - - -
\
\ branch 1
\ _ _ _ _ _ _ _
\
\ branch 2
\ _ _ _ _ _ _ _
Что я хочу в итоге:
master new branch 1
- - - - - - - | - - - - - - - - - -
\
\
\
\ branch 2
- - - - - - - - -
Ответы
Ответ 1
Решение значительно проще, чем я ожидал. Оказывается, вы можете поставить -i
на гораздо более широкий набор команд rebase (я думал, что это только для того, чтобы переделать ветвь для себя для изменения истории). Поэтому я просто запустил git rebase -i master
и сбросил эти дополнительные коммиты.
Ответ 2
Фактическая команда будет:
git rebase --onto newbranch1 branch1 branch2
Это будет воспроизведен на вершине new_branch1
все совершающее после branch1
до branch2
HEAD.
Как говорит Джошуа Голдберг в комментариях:
git rebase —onto <place-to-put-it> <last-change-that-should-NOT-move> <change to move>