воскресенье, 25 марта 2012 г.

Перенос изменений произвольных файлов между ветками в git

Постановка проблемы


Представим себе следующую ситуацию. Команда разработчиков, используя 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"

Цель достигнута. Надеюсь приведенная выше информация будет полезна тем, кто столкнется с подобными проблемами в будущем.

Комментариев нет:

Отправить комментарий