Возможность простого слияния git — одна из его сильных сторон. Во время слияния git использует слияние с перемоткой вперед, когда замечает, что HEAD текущей ветки является предком коммита, который вы пытаетесь слить. При слиянии с перемоткой вперед нет новой фиксации. Git просто перемещает указатель. Если такое поведение нежелательно, вы можете использовать флаг no-ff для создания новой фиксации для слияния.
Как выглядит слияние с быстрой перемоткой вперед и без нее
После перемотки вперед ваша история git будет выглядеть так:
C0 -> C1 -> C2-> C3
Для того же количества коммитов вот история слияния без быстрой перемотки вперед:
В первом случае нет никаких указаний на то, что было какое-либо ветвление. Во втором случае история показывает фиксацию C4, чтобы указать, где произошло слияние.
Обзор примера
Вы создадите репозиторий git, создадите ветку, а затем попробуете слияние с перемоткой вперед и без нее.
Раздел 1: Настройка
Во-первых, вы можете создать репозиторий git, выполнив следующие действия:
$ cd my_project
$ git init
$ touch a.txt
$ git add -A
$ git commit -m «C0: Добавление a.txt»
Теперь давайте создадим ветку под названием features и зафиксируем несколько изменений:
$ git checkout features
$ touch b.txt
$ git add -A
$ git commit -m «C1: Добавление b.txt»
$ touch c.txt
$ git add -A
$ git commit -m «C2: Добавление c.txt»
$ touch d.txt
$ git add -A
$ git commit -m «C3: Добавление d.txt «
Раздел 2: Слияние с быстрой пересылкой
Le Вернитесь в основную ветку и слейте в нее ветвь функций:
$ git merge features
Вывод:
Быстрая перемотка вперед
b.txt | 0
c.txt | 0
d.txt | 0
3 файла изменено, 0 вставок (+), 0 удалений (-)
режим создания 100644 b.txt
режим создания 100644 c.txt
режим создания 100644 d.txt
Если вы проверите историю, вы увидите:
9ee88eb C3: Добавление d.txt
c72b92c C2: Добавление c.txt
2e4039e C1: Добавление b.txt
08076fb C0: Добавление a.txt
Итак, все коммиты из ветки функций теперь находятся в главной ветке. Если вы продолжите вносить изменения в мастер, невозможно будет узнать, когда ветка функций была объединена с ним.
Раздел 3: Без быстрой пересылки
Повторить раздел 1 для новой папки.
Затем попробуйте слияние без перемотки вперед:
$ git merge —no-ff feature
В текстовом редакторе git по умолчанию откроется следующее:
# Пожалуйста, введите сообщение фиксации, чтобы объяснить, почему это слияние необходимо,
# особенно если оно объединяет обновленный апстрим в ветку темы.
#
# Строки, начинающиеся с ‘# ‘будет игнорироваться, а пустое сообщение прерывает
# фиксацию.
Измените комментарии. В этом случае вы можете просто добавить «C4:» перед «Объединить ветвь« features »». Результат должен выглядеть так:
b.txt | 0
c.txt | 0
d.txt | 0
3 файла изменено, 0 вставок (+), 0 удалений (-)
режим создания 100644 b.txt
режим создания 100644 c.txt
режим создания 100644 d.txt
Теперь, если вы проверите историю, она должна выглядеть следующим образом:
e071527 C4: Объединить ветвь ‘features’
bb79c25 C3: Добавить d.txt
692bd8c C2: Добавить c.txt
a0df62a C1: Добавить b.txt
7575971 C0: Добавление a.txt
Вы можете видеть, что, хотя у вас есть точно такие же изменения, эта версия слияния имеет дополнительную фиксацию C4, которая означает объединение функций ветвится в мастер.
Заключение
Флаг git merge no-ff помогает создать более читаемую историю. Он позволяет размещать теги, которые четко показывают, где произошло слияние. Это может сэкономить ваше время и усилия при отладке.
Дальнейшее изучение:
- https://git -scm.com/docs/git-merge