Как я могу безболезненно объединить расходящиеся ветви функций?

0

Вопрос

У меня есть открытый пиар в филиале под названием feature-b это скоро будет объединено с main. Тем не менее, я написал это, чтобы поддержать свою feature-a филиал, который продолжается. Я хочу продолжить работу над feature-a и использовать ту работу, которую я проделал в feature-b до того, как он был объединен с main.

Как мне лучше всего это сделать? Наше слияние с main раздавлены, поэтому все коммиты на feature-b будет переписан как единый коммит, когда он будет объединен в main. Следовательно, перебазирование feature-a на feature-b сейчас приведет к будущей конфликтной боли, когда я сольюсь feature-a Для main потому что одни и те же изменения будут внесены в разные коммиты.

Каков наилучший способ для меня включить изменения, внесенные в feature-b в моем feature-a ответвление, сводя к минимуму будущую боль, когда я в конечном итоге объединюсь feature-a Для main?

Обновить

Я пошел вперед и:

  1. Перебазирован feature-a на feature-b
  2. Внесено больше изменений (только 1 фиксация) в feature-a в то время как feature-b рассматривался
  3. Сквош-слитый feature-b как только он был одобрен (никаких дальнейших изменений не требуется, поэтому feature-a уже есть точный код, который был объединен)
  4. Вытащил последнюю main и перебазировался feature-a в довершение всего

Как и опасались, git жалуется, что несколько файлов "оба изменены" или "оба добавлены". Это само по себе было бы немного раздражающим, но это легко исправить. Что делает это невероятно запутанным - особенно если прошло какое - то время-так это комментарии слияния в файлах.

Даже несмотря на то, что оба main и feature-a ветви имеют один и тот же код во всех файлах, я получаю очень раздражающее поведение:

  1. Для файлов "оба добавлены" добавляются комментарии слияния для "ЗАГОЛОВКА (текущее изменение)" и "родителя #HASH (сообщение о фиксации)". Я вынужден выбирать то одно, то другое, хотя они совершенно одинаковы!
  2. Для "обоих измененных" файлов это еще хуже. "ЗАГОЛОВОК (текущее изменение)" показывает правильный код. Однако в разделе "родитель #ХЭШ (сообщение о фиксации)" показана половина кода. Опять же, несмотря на то, что в обеих ветвях есть весь код!! Я не шучу, принимая "входящее изменение" (как обозначено VS Code), вы удалите код, который находится в обеих ветвях!

Если бы я не внес эти изменения в быстрой последовательности, я был бы безнадежно потерян и сбит с толку тем, что показывает мне git. Это действительно случалось несколько раз в прошлом, но я не мог понять, что происходит не так. Теперь, когда я воспроизвел это и проверил поведение, я совершенно сбит с толку относительно того, что делает git и как люди справляются с этим сценарием.

ОБНОВЛЕНИЕ 2

Хорошо, я вроде как понимаю, почему он собирался удалить код сейчас. Это потому, что изменения, которые я внес в feature-b были в нескольких коммитах, и эти коммиты оказались раздавленными, когда слияние в main произошло. Это, без сомнения, источник боли, и поэтому я пытаюсь придумать более разумный рабочий процесс.

git
2021-11-23 23:26:24
1

Лучший ответ

0

Я не уверен, что окончательное слияние/сквош будет грязным. Если одно и то же изменение вносится в разные коммиты, возможно, Git сможет это обнаружить и будет доволен этим.

Если вы действительно думаете, что это будет грязно, то, что вы могли бы сделать, это:

  1. Перебазируйте свой feature-a филиал с feature-b теперь, чтобы ваш feature-a ветвь теперь включает завершенную функцию B и выполняемую функцию A, которая является тем, что вам нужно для выполнения вашей работы.
  2. После feature-b сливается в main филиал, перебазировка feature-a на коммит непосредственно перед раздавленным коммитом, который они сделали для функции B. Все должно пройти гладко.
  3. На ваше feature-a филиал, использовать git reset --soft X где X является ли хэш фиксации для раздавленной фиксации, которую они сделали для функции B. Затем используйте git commit чтобы взять на себя обязательство. Теперь у вас есть сжатая фиксация, содержимое которой равно текущему состоянию вашей работы над функцией A. Но родителем этого коммита является коммит, который добавил функцию B в основную ветвь, поэтому отличие этого коммита от этого родителя будет содержать только функцию A. На этом этапе можно продолжить работу над функцией A или просто запросить слияние.

Кстати, я вполне уверен, что все не должно было бы быть таким беспорядочным, если бы ваша организация использовала слияния вместо перебазирования для добавления объектов в основную ветвь. И тогда было бы выгодно сохранить фактическую историю кода, над которым вы работали, вместо того, чтобы просто сохранять эту искусственную историю.

2021-11-23 23:52:54

Чтобы было ясно, мы не используем перебазировки - мы используем раздавленные коммиты. И я на 99% уверен, что все будет так же грязно, как я пробовал это в прошлом. Git ужасно запутывается из-за разных коммитов, вносящих одни и те же изменения. Я готов попробовать это еще раз, хотя и отчитаться :)
me--

@me-я почти уверен, что раздавленные коммиты-это перебазирование
evolutionxbox

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

@DavidGrayson Пожалуйста, ознакомьтесь с моим обновленным вопросом для объяснения поведения, которое я вижу у git.
me--

ОК. Ваш шаг 4 ("Вытащил последнюю основную и обновленную функцию-а поверх нее") - это то, что причинило вам всю боль, поэтому я бы не рекомендовал это делать. Вместо того, чтобы выполнять шаг 4 в своем вопросе, попробуйте выполнить шаги 2 и 3 из моего ответа.
David Grayson

Спасибо @DavidGrayson. Это кажется таким ... трудоемким
me--

Как я уже сказал в своем ответе, проблема вызвана тем, что человек все это читает и сжимает, а не просто сливает.
David Grayson

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................