Git merge - объединение изменений в Git
Git merge - это команда, которая позволяет объединить изменения из одной ветки в другую. Она наиболее часто используется для интеграции веток разработки, когда завершенная функциональность переносится на основную ветку проекта.
В Git есть два основных вида слияний: fast-forward merge и recursive merge.
Fast-forward merge (слияние вперед) возможно, когда история ветки, которую мы собираемся влить, прямо находится перед текущей веткой. В таком случае Git просто перемещает указатель на последний коммит сливаемой ветки, обновляя текущую ветку и с захватом истории изменений из влитой ветки. Пример кода для выполнения fast-forward merge следующий:
$ git checkout main
$ git merge feature-branch
Recursive merge (рекурсивное слияние) используется, когда истории веток разветвлены и Git не может просто сдвинуть указатель на последний коммит сливаемой ветки. В этом случае Git выполняет рекурсивное слияние, создавая новый коммит с объединенными изменениями из обеих веток. Если есть конфликты слияния - ситуации, когда один и тот же файл был изменен в обеих ветках - Git приостанавливает слияние и подсвечивает конфликтные места, требуя ручного вмешательства разработчика для их разрешения.
Пример кода для выполнения recursive merge следующий:
$ git checkout main
$ git merge feature-branch
После выполнения команды Git проанализирует историю изменений веток и, в зависимости от типов слияний, создаст новый коммит, включающий все изменения из сливаемой ветки. В результате ветка main будет содержать все новые изменения, сделанные в ветке feature-branch.
Вот некоторые полезные флаги команды git merge:
--no-ff
: Запретить режим fast-forward и всегда создавать новый коммит для слияния. Это позволяет сохранить историю разделения веток даже в случаях, когда это необходимо.--squash
: Выполнять слияние, создавая только один коммит, который объединяет все изменения из сливаемой ветки. Это полезно, когда вы хотите сохранить функциональность, но не хотите сохранять историю разделения веток.--abort
: Прервать текущее слияние и вернуться к предыдущему состоянию репозитория, отменяя все изменения, которые были внесены во время слияния. Это полезно, когда возникают конфликты слияния и вы хотите начать с чистого листа.
Для решения конфликтов слияния Git использует маркеры конфликтов, которые позволяют разработчику ручно решать противоречия. Пример конфликтного файла и его разрешения:
<<<<<<< HEAD
Код измененный на текущей ветке
=======
Код измененный на сливаемой ветке
>>>>>>> feature-branch
В разрешении конфликтов вы можете выбирать, какие изменения сохранить, или объединять изменения из обеих веток вручную, заменяя маркеры конфликта правильной реализацией.
Теперь, когда вы знакомы с командой git merge и ее вариациями, вы можете использовать ее для объединения изменений из разных веток и обеспечения актуальности вашей основной ветки.