Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

Как перетащить несколько коммитов в другую ветку в git?

#git #git_rebase #git_cherry_pick


Дано: существуют две ветки, ветка prod в которой то что лежит на боевом сервере и
ветка develop из которой выкатывается на тестовый. Они разумеется во многом похожи
но содержат множество принципиально разных фичей.
В один прекрасный день возникает необходимость запилить тяжелую фичу прямо от прода.
Фича запиливается. Остается вопрос - как перетащить ее в ветку девелоп, чтобы при этом
не было нужно мержить всех предков этой фичи.
Смотри картинку:
Случай А: Я хочу перетащить коммиты E и F не перетаскивая коммиты A и B. Как?
Случай B: этот и дальше на практике мне пока не нужны (и рисовать было лень) но любопытно:
пусть F - это некоторое множество последовательных коммитов не оформленных в отдельную
ветку (т.е. не существует ветки содержащей в себе коммиты F и только их) Я хочу перетащить
коммиты F, но не хочу коммит(ы) E. Как?
Случай C:, хочу перетащить всю ветку фичи кроме одного-трех коммитов, которые находятся
где-нибудь в середине ветки и не являются последовательными
Случай D:, Это случай А плюс добавим что ветку от прода надо сохранить.
E: возможно ли при этом задать какое-нибудь автоматическое разрешение конфликтов
в сторону (девелопа)/(ветки с фичей)  если они будут

Пока я нашел cherry-pick но перетаскивать ветку по одному коммиту - то еще извращение
и наверняка есть человеческий способ. Правильно ли я понимаю что мне нужно копать куда-то
в сторону rebase?


    


Ответы

Ответ 1



@Volt, git cherry-pick позволяет переносить несколько коммитов сразу. Для этого нужно задать, например, диапазон коммитов: git cherry-pick F..E. Подробнее о задании диапазонов коммитов читейте здесь: http://git-scm.com/docs/gitrevisions.html

Ответ 2



Слегка поразбирался сам: Кроме массового черри-пика часть задач можно решить с помощью git rebase -i --onto develop prod feature Флаг -i позволяет решать какие коммиты оставить, какие перетаскивать из этого множества, кому изменить сообщения. Гит откроет свой редактор (по умолчанию vim) и предложит назначить каждому коммиту из ветки feature соответствующий флаг (оставить, убрать, слить с предыдущим) и изменить сообщения если нужно. Как я понимаю этот механизм применяется также для приведения истории коммитов в порядок. Способа автоматически разрешать конфликты пока не нашел.

Ответ 3



Если вы работаете в IntelliJ IDEA, то в консоли на закладке Version Control можно просматривать логи. На вкладке логов можно для одного из коммитов выполнить Cherry-Pick. Cherry-Pick – это способ забрать в текущую выбранную ветку отдельный коммит из другой ветки, не затрагивая остальных коммитов. После чего можно сделать Commit and Push в удалённый репозиторий.

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

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