Git merge позволяет нам выполнять быструю перемотку вперед и не выполнять быструю перемотку вперед. Любые идеи, когда использовать ускоренное слияние и когда не использовать ускоренное слияние?
Эта --no-ffопция полезна, когда вы хотите иметь четкое представление о вашей ветви функций. Таким образом, даже если в это время не было сделано никаких коммитов, FF возможен - вы все равно иногда хотите, чтобы каждый коммит в основной строке соответствовал одной функции. Таким образом, вы рассматриваете функциональную ветвь с кучей коммитов как один блок и объединяете их как один блок. Из вашей истории становится ясно, когда вы объединяете ветку объектов с --no-ff.
Если вас это не волнует - вы, возможно, сойдете с FF, когда это возможно. Таким образом, у вас будет больше svn-подобных ощущений от рабочего процесса.
Например, автор этой статьи считает, что --no-ffопция должна быть по умолчанию, и его рассуждения близки к тому, что я изложил выше:
Рассмотрим ситуацию, когда ряд второстепенных коммитов в ветви «feature» вместе составляют одну новую функцию: если вы просто выполните «git merge feature_branch без» --no-ff, «из истории Git невозможно увидеть, какие из объектов коммитов вместе имеют реализовал функцию - вам нужно было бы вручную прочитать все сообщения журнала. Возврат всей функции (то есть группы фиксаций) является настоящей головной болью [если --no-ffне используется], тогда как это легко сделать, если использовать --no-ffфлаг [потому что это всего лишь один коммит ».
И быстрое продвижение вперед отлично подходит для тех случаев, когда у вас есть коллекция тесно связанных ветвей, которые время от времени вы хотите просто перемещать вместе. Не все слияния являются событиями реальной истории.
Каскабель
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равно должен будет выполнить слияние. Это означает, что ускоренное слияние не всегда приемлемо.
Когда мы работаем над средой разработки и объединяем наш код с промежуточной / производственной веткой, тогда Git no fast forward не может быть лучшим вариантом. Обычно, когда мы работаем в ветке разработки для одной функции, мы склонны иметь несколько коммитов. Отслеживание изменений с помощью нескольких коммитов может быть неудобным позже. Если мы сливаемся с промежуточной / производственной веткой, используя Git без ускоренной перемотки, тогда будет только 1 коммит. Теперь в любое время мы хотим отменить функцию, просто отменить эту фиксацию. Жизнь проста.
Также возможно, что вы захотите иметь персонализированные ветки функций, где код будет размещен только в конце дня. Это позволяет отслеживать развитие в мельчайших деталях.
Я бы не хотел загрязнять основную разработку нерабочим кодом, поэтому выполнение --no-ff может быть именно тем, что нужно.
В качестве примечания, возможно, нет необходимости фиксировать рабочий код в персонализированной ветви, так как история может быть переписана git rebase -iи принудительно перенесена на сервер, если никто другой не работает в этой же ветви.
Ответы:
Эта
--no-ff
опция полезна, когда вы хотите иметь четкое представление о вашей ветви функций. Таким образом, даже если в это время не было сделано никаких коммитов, FF возможен - вы все равно иногда хотите, чтобы каждый коммит в основной строке соответствовал одной функции. Таким образом, вы рассматриваете функциональную ветвь с кучей коммитов как один блок и объединяете их как один блок. Из вашей истории становится ясно, когда вы объединяете ветку объектов с--no-ff
.Если вас это не волнует - вы, возможно, сойдете с FF, когда это возможно. Таким образом, у вас будет больше svn-подобных ощущений от рабочего процесса.
Например, автор этой статьи считает, что
--no-ff
опция должна быть по умолчанию, и его рассуждения близки к тому, что я изложил выше:Рассмотрим ситуацию, когда ряд второстепенных коммитов в ветви «feature» вместе составляют одну новую функцию: если вы просто выполните «git merge feature_branch без»
--no-ff
, «из истории Git невозможно увидеть, какие из объектов коммитов вместе имеют реализовал функцию - вам нужно было бы вручную прочитать все сообщения журнала. Возврат всей функции (то есть группы фиксаций) является настоящей головной болью [если--no-ff
не используется], тогда как это легко сделать, если использовать--no-ff
флаг [потому что это всего лишь один коммит ».источник
--no-ff
вашей истории коммитов могут не сразу проявиться при использовании базовых инструментов, таких какgit log
, которые будут продолжать отображать все коммиты из всех веток, которые были объединены в вашу текущую ветку. Тем не менее, преимущества становятся более понятными при использовании, например,git log --first-parent
в ветви интеграции, такой какdevelop
илиmaster
. Если вы религиозно использовать--no-ff
то , что будет только отображать запросы слияния, в то время как по-git log
прежнему будет обеспечивать (больше) всеобъемлющую историю. Вот почему Винсент рекомендует его для использования с GitFlow .Я могу привести пример, который обычно можно увидеть в проекте.
Здесь опция
--no-ff
(т.е. истинное слияние ) создает новый коммит с несколькими родителями и обеспечивает лучшее отслеживание истории. В противном случае--ff
(т. Е. Ускоренное слияние ) используется по умолчанию.(*) Обратите внимание, что здесь, если
newFeature
ветвь используется повторно, вместо создания новой ветки, git все--no-ff
равно должен будет выполнить слияние. Это означает, что ускоренное слияние не всегда приемлемо.источник
Когда мы работаем над средой разработки и объединяем наш код с промежуточной / производственной веткой, тогда Git no fast forward не может быть лучшим вариантом. Обычно, когда мы работаем в ветке разработки для одной функции, мы склонны иметь несколько коммитов. Отслеживание изменений с помощью нескольких коммитов может быть неудобным позже. Если мы сливаемся с промежуточной / производственной веткой, используя Git без ускоренной перемотки, тогда будет только 1 коммит. Теперь в любое время мы хотим отменить функцию, просто отменить эту фиксацию. Жизнь проста.
источник
Также возможно, что вы захотите иметь персонализированные ветки функций, где код будет размещен только в конце дня. Это позволяет отслеживать развитие в мельчайших деталях.
Я бы не хотел загрязнять основную разработку нерабочим кодом, поэтому выполнение --no-ff может быть именно тем, что нужно.
В качестве примечания, возможно, нет необходимости фиксировать рабочий код в персонализированной ветви, так как история может быть переписана
git rebase -i
и принудительно перенесена на сервер, если никто другой не работает в этой же ветви.источник