Параметр слияния --no-ff в Гите

25 мая 2015
Когда при слиянии нет расхождений в изменениях веток, то Git использует подход «Fast-forward», суть которого в том, что вместо создания коммита слияния происходит перемещение коммитов из добавляемой в принимающую ветку и сдвиг указателя принимающей ветки. Минус подхода – в дереве коммитов не отображается история слияний.

Графически «Fast-forward» выглядит следующим образом. Дерево до слияния веток master и dev_1_task_34:


Дерево после слияния. Как видим, тут не появился коммит слияния, а произошло перемещение коммита a47096c из dev_1_task_34 в ветку master:


Давайте посмотрим как это выглядит в консоли Git Bash. Имеется дерево, состоящее из двух веток: master и dev_1_task_34 (хеши коммитов отличаются от хешей на картинке выше). Ветка dev_1_task_34 выходит из коммита 5767014 и состоит из дух элементов: 2e0b852 (правка 34) и 7aebf23 (правка 34.2)


Сливаем ветки с помощью команды git merge dev_1_task_34. Затем через команду git branch -d dev_1_task_34 удаляем ненужный указатель dev_1_task_34 и выводим дерево коммитов git log --all --graph --oneline

В итоговом дереве слияние просто переместило коммиты из ветки dev_1_task_34 в ветку master и коммит слияния создан не был. Это происходит по причине того, что в master с момента созданием ветки dev_1_task_34 и до начала слияния не было никаких изменений, поэтому Git выбрал схему «Fast-forward», суть которой в перемещении коммитов

Параметр слияния --no-ff

Для отключения режима «Fast-forward» в операцию слияния добавляют параметр --no-ff.

Рассмотрим предметно. Для предыдущего примера откатимся на момент до слияния, а затем выполним слиние с помощью команды $ git merge --no-ff dev_1_task_34 и после выведем дерево, введя git log --all --graph --oneline.

Git создал коммит слияния 133805a и оставил следы веток. Этим и отличается отключенный режим «Fast-forward» от включенного