Восстановить только часть ветки

У меня две ветки (и мастер). Филиал 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>