#git #branch #git-rebase
#git #ветка #git-перебазировать
Вопрос:
У меня есть функциональная ветвь B, которая создана из функциональной ветви A. Я хочу перебазировать ветку B обратно в главную без коммитов ветки A.
Мой репозиторий выглядит следующим образом:
c1---c2---c3 master
c4---c5---c6 A
c7---c8---c9 B
Чего я хочу, так это:
c7---c8---c9 B
/
c1---c2---c3 master
c4---c5---c6 A
Я попытался выполнить перебазирование из ветки B в главную. Это ничего не дало и сохранило ветку B в ветке A.
Ответ №1:
Можно отследить от B
до master
, так что, насколько это касается Git, ветка B
уже «включена» master
. Другими словами, B
«содержит» master
.
Попробуйте указать явно, какая ветвь должна быть перебазирована, и и восходящий:
git rebase --onto master A B
Комментарии:
1.
rebase
изменяет хэш моего мозга:-s Каждый раз, когда я думаю, что наконец-то понял суть, я натыкаюсь на другой режим, который меня смущает. Думаю, мне просто нужно еще немного почитать …
Ответ №2:
Решение из трех строк, менее краткое, чем отличный ответ Криса, но, возможно, более понятное для некоторых, могло бы выглядеть следующим образом :
git branch backup-B B
git checkout -B B master
git cherry-pick A..backup-B
Объяснение шагов :
1) создайте резервную копию (также служащую ссылкой для последующего выбора)
git branch backup-B B
c1---c2---c3 <<< master
c4---c5---c6 <<< A
c7---c8---c9 <<< backup-B, B <<< HEAD
2) укажите B на master (и проверьте его в то же время)
git checkout -B B master
c1---c2---c3 <<< master, B <<< HEAD
c4---c5---c6 <<< A
c7---c8---c9 <<< backup-B
3) «скопировать» недостающие коммиты (НЕДОСТУПНЫЕ из A, но доступные из «старого» B, здесь c7
, c8
c9
)
git cherry-pick A..backup-B
c7'---c8'---c9' <<< B <<< HEAD
/
c1---c2---c3 <<< master
c4---c5---c6 <<< A
c7---c8---c9 <<< backup-B
(конечно, на этом этапе, хотя это и не обязательно, вы могли бы просто удалить резервную копию с помощью git branch -D backup-B
, чтобы получить точный результат, который вы просили. Однако такой спасательный жилет — легкая ноша для гитариста 😉
Ответ №3:
Наряду с предлагаемым решением, вот третье.
Вы можете выполнить интерактивную перебазировку. При извлечении на B
, запустите git rebase --interactive master
. Ваш $EDITOR
откроется следующим:
pick c4 Message of c4
pick c5 Message of c5
pick c6 Message of c6
pick c7 Message of c7
pick c8 Message of c8
pick c9 Message of c9
Здесь вам просто нужно удалить коммиты, принадлежащие A
, поэтому вам нужно придать файлу вид:
pick c7 Message of c7
pick c8 Message of c8
pick c9 Message of c9
Затем сохраните и завершите, и вуаля.