Когда вы используете git rebase вместо git merge?

Если вы хотите знать, как сортировать связанный список, не используя стандартные библиотеки Java, я бы предложил посмотреть на различные алгоритмы самостоятельно. Примеры здесь показывают, как реализовать сортировку вставки, другое сообщение StackOverflow показывает сортировку слияния , а ehow даже дает некоторые примеры того, как создать пользовательская функция сравнения в случае, если вы хотите дополнительно настроить свой вид.

1411
задан Nick Volynkin 24 June 2015 в 04:24
поделиться

3 ответа

Let’s смотрят на пример. При работе над ответвлением, названным login, на основе эти master ответвление, один из членов команды продвинул некоторые изменения в master. Вам нужны эти изменения для окончания login функция в ответвлении.

enter image description here рисунок 1. Новые фиксации в master ответвление (E и F), необходимы для окончания работы в эти login ответвление.

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

enter image description here рисунок 2. Слияние двух ответвлений приводит к фиксации слияния.

Мы won’t должен знать, когда мы объединились master в эти login ответвление в будущем. Вместо этого we’d нравится притворяться, что все фиксации на эти login ответвление произошли на основе нового состояния эти master ответвление.

переоснова Git’s команда временно перематывает фиксации на Вашем текущем ответвлении, получениях по запросу в фиксациях от другого ответвления и повторно применяет перемотанные фиксации назад на вершине. Путем переключения тока Это основывает текущее ответвление на другое ответвление.

enter image description here

рисунок 3. Перебазирование применяет фиксации от эти login ответвление сверху эти master ответвление.

источник здесь

1
ответ дан 3 October 2019 в 21:36
поделиться

Короткая версия

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

Итак, когда вы используете какой-либо из них?

Слияние

  • Допустим, вы создали ветку с целью разработки одной функции. Если вы хотите вернуть эти изменения в master, вы, вероятно, захотите merge (вам не нужно поддерживать все временные коммиты).

Rebase

  • Второй сценарий был бы, если бы вы начали делать какую-то разработку, а затем другой разработчик внес несвязанное изменение. Вы, вероятно, хотите вытащить, а затем перебазировать , чтобы основать свои изменения из текущей версии на репо.
1086
ответ дан 22 November 2019 в 20:19
поделиться

В дополнение к моему собственному ответу , упомянутому TSamper ,

  • , перебазировка довольно часто является хорошей идеей перед объединением, поскольку Идея заключается в том, что вы интегрируете в свою ветку Y работу ветки B , в которую вы будете сливаться.
    Но опять же, перед объединением вы разрешаете любой конфликт в вашей ветви (то есть: «rebase», как в «воспроизвести мою работу в моей ветви, начиная с недавней точки из ветви B )
    Если все сделано правильно, последующее объединение из вашей ветви в ветку B может быть ускоренным.

  • объединение влияет непосредственно на ветку назначения B , что означает, что слияния лучше быть тривиальными в противном случае ветвь B может долго возвращаться в устойчивое состояние (время для вас разрешить все конфликты)


точка слияния после ребазинга?

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

Другой сценарий (, описанный, например, в Git Ready ), состоит в том, чтобы привести работать непосредственно в B через ребазинг (который сохраняет все ваши хорошие коммиты или даже дает вам возможность переупорядочить их через интерактивный ребаз).
В этом случае (когда вы перебазируете, находясь в ветви B), вы правы: дальнейшее слияние не требуется:

Git-дерево по умолчанию, когда мы не слили и не перебазировали

rebase1

, мы получаем перебазировкой:

rebase3

Этот второй сценарий полностью посвящен тому, как вернуть новую функцию в мастер.

Моя точка зрения, описывая первый сценарий повторной проверки, состоит в том, чтобы напомнить всем, что повторная проверка также может использоваться в качестве предварительного шага к этому ( что значит «вернуть новую функцию в мастер»).
Вы можете использовать rebase, чтобы сначала ввести master "в" ветку новой функции: rebase будет воспроизводить коммиты новой функции от мастера HEAD , но все еще в ветке новой функции, эффективно перемещая вашу ветку, начиная точка от старого мастера коммит до HEAD-master .
Это позволяет вам разрешать любые конфликты в вашей ветви (то есть изолированно, в то же время позволяя мастеру продолжать развиваться параллельно, если этап разрешения конфликта занимает слишком много времени).
Затем вы можете переключиться на master и объединить new-feature (или перебазировать new-feature на master , если вы хотите сохранить коммиты, сделанные в вашем new -feature branch).

Итак:

  • «rebase vs. merge» можно рассматривать как два способа импорта работы, скажем, на master .
  • Но «rebase затем объединить» может быть допустимым рабочим процессом, который сначала разрешает конфликт в изоляции, а затем возвращает вашу работу.
264
ответ дан 22 November 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: