Как сохранить долго работающие ветки Git

Git ветки в идеале должны длиться недолго, возможно, в течение 1-2 дней. Тогда это объединено в некоторую основную линию.

Но в некоторых случаях, когда мы работаем с очень большими функциями, мы поддерживаем ветки. И когда 2 или 3 человека работают над этими очень большими функциями в исключительных областях кода, становится довольно сложно поддерживать их.

Среди исправлений, которые идут в стабильную ветвь, нам нужно синхронизировать эти 2-3 большие ветви со стабильной веткой. Таким образом, мы делаем это довольно часто.

(in feature-branch1) $ git merge stable
(in feature-branch2) $ git merge stable
(in feature-branch3) $ git merge stable

Есть ли правильный способ сохранить эти длинные ветки в git? Делая вышеизложенное, история git немного запутана. Эти функциональные ветви в основном отправляются на удаленный компьютер, что означает, что мы не можем видеть rebase как вариант. Что еще я могу сделать?

3 ответа

Решение

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

Да, ваша история может выглядеть немного запутанно, когда вы вернете ветку функций обратно в стабильную. Но пока вы избегаете беспорядка ежедневных микро-слияний из ваших мерзавцев (используйте git pull --rebase вместо этого), вы сможете оценить реальные значимые слияния.

Если вы действительно хотите избежать слияния новых функций из стабильного в ветку функций, но просто хотите исправлять ошибки, вы можете выбрать исправления ошибок в ветке функций. Однако это может быть много работы, потому что это требует, чтобы вы всегда были в курсе всего, что происходит в стабильной. использование git cherry чтобы помочь вам:

# commits from "stable" that are not present in
# the current branch will be prefixed with "+"
git cherry HEAD stable

Перебазирование возможно, если команда достаточно мала и состоит из достаточно опытных пользователей git.

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

Все должно быть хорошо, но в случае, если вы забудете синхронизироваться с перебазированной веткой функций, скажем, вы зафиксировали C поверх старой ветки oldFB, который был перебазирован в oldFB':

S1 - oldFB - C <-- feature-branch
    \
     S2 - oldFB' - D <-- origin/feature-branch

Все еще возможно перебазировать ваш коммит (ы) C запустив:

git checkout feature-branch
git rebase --onto origin/feature-branch oldFB C

Обратите внимание, что вам придется вручную найти коммит oldFB на диаграмме выше.

Наилучшим вариантом является объединение только необходимых небольших веток исправлений / функций в ваши долгоживущие ветки функций. Таким образом, вы получаете только то, что вам нужно. Обратите внимание, что если вы позволите этим ветвям прожить достаточно долго, они в конечном итоге могут получить несинхронную синхронизацию с мастером. Время от времени вы можете захотеть создать временную ветвь из своей ветки с долгоживущим функционалом и объединить с ней мастер для просто проверки работоспособности - посмотрите, есть ли конфликты, посмотрите, не нарушают ли изменения в мастере функцию, и т.д. на.

Следующим лучшим вариантом будет периодическое слияние мастера с вашими долгоживущими ветвями функций. Это довольно безопасно, но может также объединить множество изменений, которые вас не интересуют, и усложнить ситуацию.

Я бы не рекомендовал периодически перебазировать на мастера. Это затрудняет синхронизацию для всех, а также значительно усложняет ведение сложной истории (слияний) в ветвях функций и делает разрешение конфликтов более трудным делом.

Другие вопросы по тегам