Как перебазировать ветку, которая была разветвлена ​​в разных точках - PullRequest
1 голос
/ 25 апреля 2020

У меня есть ветвь с именем release, которая разветвляется от master некоторое время назад. Сегодня у меня есть две ветви, одна из которых основана на master с именем basedMaster, а другая - на основе релиза под названием basedRelease. Я недавно внес изменения, чтобы освоить около 10+ коммитов. Я знаю, что вы можете cherry-pick эти коммиты, но я хочу выяснить, как перебазировать эти 10+ коммитов в ветвь basedRelease. Я предполагаю, что эти коммиты от basedMaster только 10+ - именно то, что я хочу. Я попробовал rebasing, но он также получит коммиты от других разработчиков, а это не то, что я хотел. Итак, я получил другую ветку от basedMaster под названием basedMasterLocal, думая, что она будет нести только 10 коммитов, которые я сделал, в эту ветку basedRelease. Однако у меня возникли проблемы с тем, чтобы выяснить, как это сделать, поскольку я не хочу использовать cherry-pick и хотел бы решить эту проблему с помощью rebase

1 Ответ

2 голосов
/ 25 апреля 2020

Давайте нарисуем это.

У меня есть ветвь с именем release, которая разветвляется от мастера некоторое время назад.

A - B - C - F - G [master]
         \
          D - E [release]

Теперь сегодня, У меня есть две ветви, одна из которых основана на master, называемая basedMaster, а другая - на основе релиза, называемая basedRelease.

Я предполагаю, что вы добавили некоторые коммиты в эти ветви, в противном случае они не имеют значения .

                  H - I [basedMaster]
                 /
A - B - C - F - G [master]
         \
          D - E [release]
               \
                J - K [basedRelease]

Я недавно внес изменения в мастеринг при 10+ коммитах.

Давайте сделаем это два.

                  H - I [basedMaster]
                 /
A - B - C - F - G - L - M [master]
         \
          D - E [release]
               \
                J - K [basedRelease]

Итак, я получил другую ветку от basedMaster, называемую basedMasterLocal

                        [basedMasterLocal]
                  H - I [basedMaster]
                 /
A - B - C - F - G - L - M [master]
         \
          D - E [release]
               \
                J - K [basedRelease]

С этим у нас есть лучшее представление о состоянии хранилища.

Я хочу выяснить способ перебазирования этих 10+ коммитов в ветвь basedRelease.

Неясно, хотите ли вы, чтобы все коммиты были в master, но не в basedRelease, или только конкретно эти 10+ коммитов ты упомянул. И неясно, хотите ли вы скопировать их (cherry-pick) или переместить их (rebase).

У меня возникли проблемы, так как чтобы понять, как это сделать, поскольку я не хочу использовать cherry-pick и хотел бы решить эту проблему с помощью rebase.

В любом случае, вы можете выбрать вишню несколько коммитов. Это займет целый ряд коммитов. Мы можем использовать .., где x..y означает «все коммиты, которые достижимы от y, кроме тех, которые достижимы от x». См. gitrevisions / Specifying Ranges для получения дополнительной информации.

Предполагается, что вы basedRelease извлекли ... если вы хотите скопировать (cherry-pick) все коммиты в master, но не в basedRelease.

# All the commits reachable from master
# excluding those reachable from HEAD (the currently checked out commit).
git cherry-pick HEAD..master

Если это всего лишь 10+ коммитов, вы можете записать эти 10 коммитов. В этом примере это всего два, L и M.

git cherry-pick L M

Или вы можете заметить, что это коммиты, которые находятся в master, но не в basedMaster.

git cherry-pick basedMaster..master

И если вы хотите переместить (перебазировать) их.

git rebase --onto basedRelease basedMaster..master

Подобные примеры есть в примерах git -cherry-pick и git -rebase аналогичный пример в его описании .


Этот вид сложных обменов между долгоживущими ветвями является одной из причин, почему я рекомендую не иметь несколько долгоживущих ветвей, и определенно не иметь ветвей от них. Поддержание их в синхронизации c быстро усложняется.

Вместо этого я рекомендую иметь одну долгоживущую ветвь: master. Ничто не передается непосредственно master. Вся работа ведется на коротких тематических ветках. Они должны пройти QA до слияния в master. После объединения они удаляются. Таким образом, master всегда стабилен и готов к выпуску. Релизы отслеживаются с помощью тегов. Это рабочий процесс ветви .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...