2016-01-21 3 views
15

У меня есть две ветви (и мастер). Филиал 2 основан на Филиале 1 на основе мастера. Я отправил отчет 1 для обзора, у него были некоторые изменения, я переустановил некоторые из этих изменений в историю и объединил результат в мастер.Rebase только часть ветки

Теперь мне нужно переустановить отделение 2 на вершине мастера, чтобы подготовить его для обзора/слияния.

Проблема заключается в том, что в Ветве 2 по-прежнему содержатся оригинальные фиксации ветви 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 
             - - - - - - - - - 
+4

Граф ASCII, представляющий состояние вашего репо, поможет. На первый взгляд, я бы сказал, что вы ищете ['git rebase -onto'] (https://git-scm.com/docs/git-rebase). Посмотрите, поможет ли это: http://stackoverflow.com/questions/28715619/how-can-i-rebase-part-of-a-branch-to-the-master-branch/28715930#28715930 – Jubobs

+0

Лучше! См. Также верхнюю часть http://stackoverflow.com/questions/25488138/move-initial-commits-off-master-to-another-branch-in-git/25490288#25490288 – Jubobs

+0

git rebase --onto почти сработало для меня , Я сделал git rebase --onto master --root HEAD ~ 1', но по какой-то причине он выбрал три коммиты, чтобы взять с собой вместо «HEAD ~ 1» и вверх. Кроме того, вместо того, чтобы перезагрузить мою ветку, я сейчас в состоянии состояния HEAD. – Puppy

ответ

11

Раствор, значительно проще, чем я ожидал. Оказывается, вы можете поставить -i на гораздо более широкий набор команд rebase (я думал, что это было только для перераспределения ветки для изменения истории). Поэтому я просто запустил git rebase -i master и сбросил эти дополнительные коммиты.

+0

Чтобы прояснить, что сделал @Puppy, он сделал интерактивную переадресацию из ветки 2 на новую ветку 1 ('git rebase -i new_branch_1' в то время как на ветке 2) и удалил всю ветвь 1, совершая транзакцию с помощью интерактивной консоли, поэтому были сыграны только коммиты филиала 2 , – theannouncer

19

Фактическая команда будет:

git rebase --onto newbranch1 branch1 branch2 

Это будет воспроизведен на вершине new_branch1 все совершает послеbranch1 до branch2 ГОЛОВА.

+0

Он уверен, что (собирался опубликовать то же самое). Кстати, 'git help rebase' охватывает этот случай. –

+0

@TomFenech даже лучше, чем 'git help rebase': http://stackoverflow.com/a/2369516/6309 (мой старый ответ 2010 года);) – VonC

Смежные вопросы