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-й ветке
- для новых изменений добавить тесты
- вы можете проверить работу изменений для обеих ветвей
Обновление:
Для управления изменениями в обоих ветках вам, вероятно, просто нужен процесс, например:
- работать в основном на отраслевом рефакторинге
- объединить каждую "историю" или рабочий элемент в ветвь-наследие, как это делается.
Второй шаг - это то, что я думаю, будет много работать, если код слишком отличается между ветвями. Если вам нужно поддерживать обе ветки, попробуйте инкапсулировать новый код в библиотеку, которая может использоваться в обеих ветвях. Это приведет к слиянию из одной ветки в другую уборщицу.