среда, 21 декабря 2011 г.

hg shevle, или что делать если начал кодить не в той ветке

Дисклеймер: возможно кому-то то что написано ниже покажется очевидным и у него появится желание написать комментарий вроде "RTFM, noob", но мне как-то ||.

Так как исторически мы со товарищи используем Mercurial в нашей работе, то частенько (по крайней мере у меня) возникает ситуация, когда начинаешь кодить не в той ветке, т.е. локальная копия не в, допустим, development, а в production. Причем, часто выясняется это уже после того, как большой кусок кода написан. Что же делать в этом случае? Есть конечно варианты геморойные, вроде ручного копирования изменений из одной ветки в другую каким-бы то ни было способом.



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

Разработчики Mercurial как раз для подобных ситуаций придумали комманду hg shelve. Так как я не фанат консоли, то буду показывать как пользоваться этой фичей из графической обвязки TortoiseHg.

Итак, пытаемся перейти на другую ветку, и видим ругань на наличие незафиксированных изенений. Там же есть кнопка для вызова Shelve tool. Нажимаем ее и видим нечто подобное:


Слева у нас текущие изменения, а справа у нас т.н. shelf. Полка, стеллаж - очень удачный перевод в данном случае. По сути это patch файл, в который можно перенести изменения из рабочей копии. Так же их омжно оттуда вернуть опять же в рабочую копию. Кнопки со стрелками в верхней части позволяют перенести один/все файлы на полку/с полки. Полку можно очистить. Полку можно создать новую. В общем, перенесли все что нужно в правую часть и закрыли.

Пытливый читатель обнаружит после данных действий пару кирпичей под своим стулом и задастся вопросом "Какова #$%, где вся моя работа за полдня???". Но ничего страшного, вся работа в целости и сохранности, на полке. Обновляемся на нужную нам ветку и через меню Repository->Shelve... вызываем опять эту же тулзу. Выбираем использованный прежде shelf. Переносим изменения из правой части в левую, закрываем и вуа-ля, все изменения на своем месте, можно продолжать конкурировать с индусами.

На данном этапе по идее могут возникнуть проблемы если ветки очень сильно различаются, что-то вроде merge conflict. Я с такими случаями пока не сталкивался, специально проверять как из них выходить было лень. По идее можно переносить отдельными изменениями (chunk-ами), а все, что конфликтует потом уже добавлять вручную, для чего даже кнопки соответствующие предусмотрены.


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

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