Git fast forward VS без ускоренного слияния

247

Git merge позволяет нам выполнять быструю перемотку вперед и не выполнять быструю перемотку вперед. Любые идеи, когда использовать ускоренное слияние и когда не использовать ускоренное слияние?

Чау Чи Ян
источник
2
Я думаю, что другая действительно хорошая перспектива может быть найдена здесь endoflineblog.com/gitflow-considered-harmful
Дмитрий Минковский
Тот же вопрос? stackoverflow.com/questions/9069061
Юша Алеауб

Ответы:

290

Эта --no-ffопция полезна, когда вы хотите иметь четкое представление о вашей ветви функций. Таким образом, даже если в это время не было сделано никаких коммитов, FF возможен - вы все равно иногда хотите, чтобы каждый коммит в основной строке соответствовал одной функции. Таким образом, вы рассматриваете функциональную ветвь с кучей коммитов как один блок и объединяете их как один блок. Из вашей истории становится ясно, когда вы объединяете ветку объектов с --no-ff.

Если вас это не волнует - вы, возможно, сойдете с FF, когда это возможно. Таким образом, у вас будет больше svn-подобных ощущений от рабочего процесса.

Например, автор этой статьи считает, что --no-ffопция должна быть по умолчанию, и его рассуждения близки к тому, что я изложил выше:

Рассмотрим ситуацию, когда ряд второстепенных коммитов в ветви «feature» вместе составляют одну новую функцию: если вы просто выполните «git merge feature_branch без» --no-ff, «из истории Git невозможно увидеть, какие из объектов коммитов вместе имеют реализовал функцию - вам нужно было бы вручную прочитать все сообщения журнала. Возврат всей функции (то есть группы фиксаций) является настоящей головной болью [если --no-ffне используется], тогда как это легко сделать, если использовать --no-ffфлаг [потому что это всего лишь один коммит ».

Рисунок, показывающий, как --no-ff группирует все коммиты из функциональной ветви в один коммит в основной ветке

Иван Данилов
источник
3
И быстрое продвижение вперед отлично подходит для тех случаев, когда у вас есть коллекция тесно связанных ветвей, которые время от времени вы хотите просто перемещать вместе. Не все слияния являются событиями реальной истории.
Каскабель
3
Зачем тогда поддерживать несколько веток? Если они тесно связаны - почему бы не сделать все на одной ветке?
Иван Данилов
11
Тесно связанный не означает идентичный. Кроме того, рабочий процесс не всегда аккуратен. Вы не всегда делаете коммиты, о которых вы думаете, что собираетесь, вы не всегда переходите из лучшего места. Возможно, вы запустите пару функций из одного места, начнете работать с одной из них, поймете, что она является общей, и перенесете другую на нее, прежде чем начать расходиться.
Каскабель
2
Что касается первого ответа, я понимаю, что ОП хочет знать лучшие практики для подражания. Вещи случаются, и не все идеально, но это больше похоже на вынужденный компромисс.
Иван Данилов
1
Стоит отметить, что преимущества --no-ffвашей истории коммитов могут не сразу проявиться при использовании базовых инструментов, таких как git log, которые будут продолжать отображать все коммиты из всех веток, которые были объединены в вашу текущую ветку. Тем не менее, преимущества становятся более понятными при использовании, например, git log --first-parentв ветви интеграции, такой как developили master. Если вы религиозно использовать --no-ffто , что будет только отображать запросы слияния, в то время как по- git logпрежнему будет обеспечивать (больше) всеобъемлющую историю. Вот почему Винсент рекомендует его для использования с GitFlow .
Джереми Кейни
12

Я могу привести пример, который обычно можно увидеть в проекте.

Здесь опция --no-ff(т.е. истинное слияние ) создает новый коммит с несколькими родителями и обеспечивает лучшее отслеживание истории. В противном случае --ff(т. Е. Ускоренное слияние ) используется по умолчанию.

$ git checkout master
$ git checkout -b newFeature
$ ...
$ git commit -m 'work from day 1'
$ ...
$ git commit -m 'work from day 2'
$ ...
$ git commit -m 'finish the feature'
$ git checkout master
$ git merge --no-ff newFeature -m 'add new feature'
$ git log
// something like below
commit 'add new feature'         // => commit created at merge with proper message
commit 'finish the feature'
commit 'work from day 2'
commit 'work from day 1'
$ gitk                           // => see details with graph

$ git checkout -b anotherFeature        // => create a new branch (*)
$ ...
$ git commit -m 'work from day 3'
$ ...
$ git commit -m 'work from day 4'
$ ...
$ git commit -m 'finish another feature'
$ git checkout master
$ git merge anotherFeature       // --ff is by default, message will be ignored
$ git log
// something like below
commit 'work from day 4'
commit 'work from day 3'
commit 'add new feature'
commit 'finish the feature'
commit ...
$ gitk                           // => see details with graph

(*) Обратите внимание, что здесь, если newFeatureветвь используется повторно, вместо создания новой ветки, git все --no-ffравно должен будет выполнить слияние. Это означает, что ускоренное слияние не всегда приемлемо.

themefield
источник
6

Когда мы работаем над средой разработки и объединяем наш код с промежуточной / производственной веткой, тогда Git no fast forward не может быть лучшим вариантом. Обычно, когда мы работаем в ветке разработки для одной функции, мы склонны иметь несколько коммитов. Отслеживание изменений с помощью нескольких коммитов может быть неудобным позже. Если мы сливаемся с промежуточной / производственной веткой, используя Git без ускоренной перемотки, тогда будет только 1 коммит. Теперь в любое время мы хотим отменить функцию, просто отменить эту фиксацию. Жизнь проста.

Притом Нанди
источник
0

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

Я бы не хотел загрязнять основную разработку нерабочим кодом, поэтому выполнение --no-ff может быть именно тем, что нужно.

В качестве примечания, возможно, нет необходимости фиксировать рабочий код в персонализированной ветви, так как история может быть переписана git rebase -iи принудительно перенесена на сервер, если никто другой не работает в этой же ветви.

g24l
источник