Постановка проблемы
Представим себе следующую ситуацию. Команда разработчиков, используя git в качестве системы контроля версий, работает несколько дней над одной из фич (feature). Назовем ее условно mega-feature. Произведено несколько десятков коммитов (commit) в ветку (branch) develop-mega-feature, которая была создана от ветки develop. В определенный момент времени возникает необходимость добавить результат работы над mega-feature в основную ветку (назовем ее master). При этом возникает следующая проблема, требующая нестандартного подхода: как перенести функционал mega-feature в виде отдельных файлов, в которых производились изменения, разбросанные по разным коммитам?
Подход к организации репозитория
Один из наиболее популярных применяемых подходов к организации структуры веток в git-репозиториях, подробно описанный в следующем посте, изображен ниже:
Основная идея состоит в том, чтобы основная масса коммитов осуществлялась в ветку develop; для каждой из фич создавалась отдельная ветка, которая в последствии мержится (merge) в develop; слияние (merge) из develop в master осуществляется в моменты выхода очередных релизов (release). То есть в основной ветке хранится стабильная весия кода, который был, или будет выпущен.
При вышеописанной схеме решение проблемы добавления части функционала из экпериментальной веткиdevelop-mega-feature в master стандартными подходами, которые основаны на слиянии отдельных коммитов, довольно проблематично. В git существует возможность добавления из одной ветки в другую произвольно выбранных коммитов (опять же, коммитов, но не файлов!) с помощью git-cherry-pick, однако это не является решением описанной выше проблемы.
Элегантное решение
Существует достаточно элегантное решение, которое позволяет осуществлять добавление изменений, относящихся к недавно-разработанному функционалу mega-feature.
Итак, представим, что для переноса функционала mega-feature в master, необходимо добавить из веткиdevelop-mega-feature следующие новые файлы: megafeature/implementation.code, megafeature/description.txt и следующий модифицированный файл projectfeatures.code.
Находясь в ветке master, выполняем
git checkout develop-mega-feature megafeature/implementation.code megafeature/description.txt projectfeatures.code
в качестве аргументов указываем ветку, из которой собираемся добавлять функционал и список файлов, относящихся к функционалу mega-feature. Завершаем операцию командой
git commit -m "added mega-feature functionality"
Цель достигнута. Надеюсь приведенная выше информация будет полезна тем, кто столкнется с подобными проблемами в будущем.
Комментариев нет:
Отправить комментарий