Как мне перенести коммит в git? - PullRequest
37 голосов
/ 17 сентября 2009

Итак, в моем проекте есть ветка обслуживания и ветка master. Если я сделаю коммит в ветке обслуживания и захочу объединить его с главной веткой, это просто:

git checkout master; git merge maintenance

Но если я хочу пойти другим путем, то есть применить коммит, сделанный для мастеринга обратно в мою ветку обслуживания, как мне это сделать? Это считается сбором вишни? Приведет ли это к проблемам или конфликтам, если я снова объединю ветвь обслуживания?

Ответы [ 6 ]

33 голосов
/ 17 сентября 2009

Это именно тот случай использования git-cherry-pick

git checkout maintenance
git cherry-pick <commit from master>
15 голосов
/ 19 сентября 2009

Альтернативным решением использования "git cherry-pick" (как рекомендуется в других ответах) было бы создать отдельную ветку [theme] для исправления off ветке обслуживания и объединить эта ветвь сначала в ветку обслуживания, затем в основную ветку (транк).

Этот рабочий процесс (в некоторой степени) описан в Устранение конфликтов / зависимостей между ветками темы на раннем этапе сообщение в блоге Junio ​​C Hamano, сопровождающего git.

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

0 голосов
/ 25 февраля 2015

Как уже говорили другие, сбор вишни, вероятно, лучший вариант. Я просто хотел добавить, что конфликты во время выбора вишни часто можно разрешить, изучая «зависимости» коммита, который вы выбираете вишней, и что я создал инструмент под названием git-deps для обнаружения и визуализировать эти зависимости. Если вы зайдете на домашнюю страницу, вы увидите два видео YouTube: первое дает общее представление об инструменте, а второе демонстрирует, как его можно использовать, чтобы избежать конфликтов при сборке вишни.

0 голосов
/ 22 июня 2012

Для сложных коммитов, которые нельзя применить с помощью git cherry-pick, вы можете попробовать

git checkout -b merge-branch master
git rebase --onto=`git merge-base master maintenance` HEAD~1 && git rebase master

Объяснил: http://blog.boombatower.com/automatically-backport-commits-using-git.

0 голосов
/ 17 сентября 2009

Как правило, я использую слияние, чтобы перемещать изменения «вверх» по дереву (от обслуживания к мастеру) и перебазировать, чтобы перемещать их «вниз» по дереву (от мастера к обслуживанию). Это позволяет сохранить порядок коммитов в основной ветке.

Rebase по существу откатывает все ваши изменения в текущей ветке на ветвь (или последнюю перебазировку), копирует более новые изменения и затем повторно применяет ваши изменения.

Если вы не хотите получать все изменений от мастера, то вам, вероятно, нужно выбрать те, которые вы хотите.

0 голосов
/ 17 сентября 2009

Да, это считается сбором вишни, и нет, обычно не должно вызывать проблем. Если коммит не применяется корректно при бэкпорте, вы можете столкнуться с точно таким же конфликтом, когда выбираете его обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...