Как перебазировать мою ветку функций в ветку разработки в git с наименьшими возможными конфликтами?

У меня есть ветка функций, которая превысила 30 или более коммитов. Тем временем в ветке разработки несколько других функций были выдвинуты другими разработчиками. Поэтому каждый раз, когда в разработке публикуется новая функция, меня просят:

  1. Перебазировать ветку разработки на мою ветку функций
  2. Решить конфликты, если они есть
  3. Продолжайте развиваться в своей функциональной ветке

Проблема

Второй шаг – это куриная шея. При перебазировании возникают конфликты для каждого коммита этой ветки. Это действительно итеративно и избыточно. Обратите внимание: я не всегда могу сразу же перебазировать ветку разработки, так как моя собственная работа в моей ветке все еще продолжается.

Что я пробовал?

  1. Для squash и максимально сократить мои коммиты (но это меньше всего помогает, так как в большинстве случаев нечего раздавливать)
  2. Для stash моих текущих изменений и перебазирования разработки, а затем удаления моих изменений. (но здесь у меня тоже возникают конфликты)
  3. Использование -preserve-merges с перебазированием. (но все здесь кричат, что использовать это категорически не рекомендуется)

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


person Karan Desai    schedule 23.08.2017    source источник


Ответы (3)


Рабочий процесс правильный (rebase).
Но конфликты не должны разрешаться каждый раз снова и снова.

Для этого у вас есть git rerere: активируйте его (git config --global rerere.enabled true), разрешите конфликт в последний раз (или выполните переобучение вручную или использовать contrib/rerere-train.sh), и ваша следующая перебазировка будет повторно использовать это разрешение конфликтов при следующей перебазировке.

person VonC    schedule 23.08.2017
comment
Вау, никогда не слышал о rerere .. Обязательно попробую ... Спасибо. - person Karan Desai; 23.08.2017
comment
@KaranDesai Опять же, как я уже упоминал, вы можете переобучить rerere, чтобы избежать необходимости разрешать (снова) конфликты слияния. После завершения переобучения вы можете повторить попытку перебазирования: больше не должно быть конфликтов (при прошлых коммитах) - person VonC; 23.08.2017

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

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

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

Вы можете включить rerere глобально с помощью

git config --global rerere.enabled true
person Francesco    schedule 23.08.2017
comment
Woah rerere не редкость, значит (только я этого не знал). То же предложение было и в предыдущем ответе. +1 за добавление синтаксиса, чтобы включить его глобально. Обязательно попробую - person Karan Desai; 23.08.2017

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

person yorammi    schedule 03.09.2017