Git: Как правильно объединить две функциональные и совершенно разные ветки?

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

Но что более важно, какова должна была быть моя первоначальная стратегия в таком сценарии?

Ответ 1

Поскольку задача состояла в том, чтобы просто использовать другую ветку вместо master, вы можете просто удалить ветвь master полностью или переименовать ее, чтобы сказать - legacy, затем взять другую ветвь и переименовать ее в master. Это. Вот фактические команды, которые вам нужно выполнить для достижения цели локально и на GitHub:

git branch -m master legacy               # rename local master to legacy
git checkout legacy
git branch -m another_branch master       # another_branch will be our new master

Локально мы делаем сейчас. Однако вы не можете просто удалить ветвь master на GitHub. Сначала вам нужно сначала поместить другую ветку. Это можно сделать в репозитории Settings > Default Branch. После этого вы можете продолжить:

git push origin :master                   # remove master on GitHub
git push origin master                    # push out our new master branch
git push origin legacy                    # push our legacy branch too

Затем вернитесь к Settings > Default Branch и переключите ветку по умолчанию на master. Кроме того, вы можете удалить все дополнительные ветки, которые вы могли создать во время процесса миграции.

В качестве альтернативы, если вы хотите сохранить все свои действия в истории, верните правильный ответ здесь.

Ответ 2

Поскольку у вас есть 2 ветки, один из них значительно реорганизуется из другого, и вы поддерживаете оба... я бы сказал, что Git не поможет вам в магии. Для Git, чтобы помочь, исправления/изменения, которые вы применяете к ветки 1, должны быть похожи на ветвь 2 (но не точно то же самое).

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

Что вы должны сделать в первую очередь?

  • добавьте код ошибки unit test и/или интеграции в начальную ветвь
  • выполните те же интеграционные тесты на 2-й ветке
  • для новых изменений добавить тесты
  • вы можете проверить работу изменений для обеих ветвей

Обновление: Для управления изменениями в обоих ветках вам, вероятно, просто нужен процесс, например:  - работать в основном на отраслевом рефакторинге  - объединить каждую "историю" или рабочий элемент в ветвь-наследие, как это делается.

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