Всем привет.
У меня есть проект. В нём есть (условно) три ветки: релизная ветка, плюс две ветки с фичами.
Процесс разработки идёт так: я что-то правлю в фичёвой ветке, потом вмёрживаю её в релизную, собираю проект.
Сейчас понадобилось перекинуть немного кода из одной фичёвой ветки в другую.
Что я сделал:
нашёл нужный код, вырезал из фиче-ветки-1, закоммитил;
вставил этот же самый код в фиче-ветку-2, закоммитил;
влил обе ветки в релизную, поправил конфликты.
Вопроса два:
почему это работает плохо?
как это делать правильно?
Что плохо:
много конфликтов;
для папок это не работает совсем (то есть, если я удалил из одной ветки файл целиком, а в другой ветке добавил его же, то в релизную ветку это не попадёт вовсе, то есть, мёрж эту папку/файл не видит).
ЗЫ: Предвосхищая вопрос "а зачем ты так делаешь": я бы с радостью не делал так, но руководство очень хочет, чтобы я перетащил код из одной ветки в другую.
ЗЗЫ: Отделить конкретный коммит, в котором есть код, и переносить покоммитно не получается. Потому что код добавлялся понемногу и вперемешку (то есть, в коммит мог попасть и не относящийся к фиче код).
Вы похоже рассматриваете ветки как простое хранилище файлов. Но нужно мыслить не файлами а изменениями. Важно не конкретное состоянии файлов, а их отличие от корневой ветки. И переносить тогда лучше коммиты целиком — изменения, удаляя их из одной ветки и добавляя в другой.
нашёл нужный код, вырезал из фиче-ветки-1, закоммитил;
Этим вы сами сообщили гиту а том, что код нужно удалить, что он и выполнил при слиянии. Какие к нему претензии?
Возможно помогло бы склеивание ветки (squash) при слиянии. Чтобы факт удаления файлов в принципе не появлялся в истории ветки.
Я бы в таком случае разбил коммиты на более мелкие и пересобрал ветки в нужных конфигурациях. Это удобно делать в нормальных GUI-клиентах, например в SmartGit.
Потому что "в коммит мог попасть и не относящийся к фиче код".
как это делать правильно?
Делать атомарные коммиты - все изменения в коммите должны быть жёстко связаны друг с другом, коммиты должны быть максимально мелкие и частые. А процесс переноса делайте через cherry-pick.