Почему git слияние иногда создает фиксацию, иногда нет?

Когда я делаю git merge из другой ветки в текущую рабочую область, git иногда совершает новую фиксацию:

Merge remote-tracking branch xxx into xxx

Иногда, это не так:

Fast-forward
... src files ...

Итак, что определяет, нужно ли создавать коммит или нет?

Ответы

Ответ 1

Так называемые слияния "Fast-forward" не производят фиксацию, тогда как другие слияния (часто называемые "octopus merge" (теперь вы видите, почему github mascott - это октокат)) производят коммиты.

В принципе, перемотка вперед происходит, когда ваши ветки не расходятся.

Предположим, вы хотите объединить ветвь foo в ветке master. Если эти ветки не расходятся, у вас будет такая история (каждый * представляет собой фиксацию):

*---* (master)
     \
      *---*---* (foo)

В этой ситуации слияние ускоренная перемотка вперед, потому что (согласно теории графов, лежащей в основе построения графика git), master можно достичь из foo, Другими словами, вам просто нужно переместить ссылку master на foo, и все будет готово:

*---*
     \
      *---*---* (master, foo)

Когда ваши ветки расходятся:

*---*---* (master)
     \
      *---*---* (foo)

Вам нужно создать фиксацию для объединения двух ветвей:

                ↓
*---*---*-------* (master)
     \         / 
      *---*---* (foo)

Фиксирование, указанное стрелкой, является фиксацией слияния и имеет две родительские коммиты (первый кончик ветки master и текущий кончик ветки foo).

Обратите внимание, что вы можете заставить git создать фиксацию слияния для быстрого слияния с опцией --no-ff.

Я очень рекомендую читать http://think-like-a-git.net/ за хорошее понимание того, как теория графов относится к git (вам не нужно знать теорию графа, все, что вам нужно знать, находится на веб-сайте), что сделает работу с git невероятно легкой:)

Ответ 2

Быстрая перемотка вперед означает, что фиксация уже произошла и хранится в вашем журнале, и ваш HEAD (указатель) переместился вперед к этому фиксации. Вы можете проверить поведение слияния здесь

Ответ 3

Вы можете использовать параметр --no-ff, чтобы заставить новую фиксацию избежать быстрой перемотки вперед.

Ответ 4

Если опция быстрого перехода --no-ff не представлена ​​git не создаст фиксацию, если глава ветки, в которую вы объединяетесь, является предком объединенной ветки. В этом случае (без опции --no-ff) он просто переместит голову (ускоренная перемотка вперед).