Это многостраничный печатный вид этого раздела. Нажмите что бы печатать.

Вернуться к обычному просмотру страницы.

Слияние (merge)

Слияние веток в Git

Что такое git merge?

git merge – это команда в Git, которая используется для объединения изменений из одной ветки в другую. Основная цель git merge – интеграция изменений, сделанных в другой ветке, в текущую ветку, обеспечивая сохранение полной истории изменений и разрешение конфликтов, если они возникают.

Основные характеристики

  • Объединение изменений: git merge позволяет объединить изменения из другой ветки в текущую ветку.
  • Сохранение истории: В отличие от rebase, merge сохраняет историю коммитов в том виде, в каком они были изначально.
  • Создание коммита слияния: При выполнении слияния создаётся новый коммит слияния, если слияние не является fast-forward.

Типы слияний

  1. Fast-forward: Если текущая ветка не содержит коммитов, созданных после последнего общего коммита с веткой, которую вы хотите слить, Git просто перемещает указатель текущей ветки вперед. В этом случае новый коммит слияния не создаётся.

    git merge <ветка>
    
  2. Recursive merge: Если обе ветки содержат уникальные коммиты после последнего общего коммита, создаётся новый коммит слияния. Это поведение по умолчанию для большинства слияний.

    git merge <ветка>
    

Синтаксис

git merge <ветка>
  • <ветка> – имя ветки, изменения из которой вы хотите объединить в текущую ветку.

Пример использования

  1. Обычное слияние:
    git checkout main
    git merge feature-branch
    
    Эта команда объединяет изменения из ветки feature-branch в ветку main.

Полезные флаги и опции

  • --no-ff: Отключает fast-forward слияние и всегда создаёт новый коммит слияния.

    git merge --no-ff feature-branch
    
  • --squash: Объединяет изменения из ветки в рабочую директорию, но не создаёт коммит слияния. После этого вам нужно вручную закоммитить изменения.

    git merge --squash feature-branch
    
  • --no-commit: Выполняет слияние, но не делает коммит автоматически. Это позволяет вам сделать дополнительные изменения перед созданием коммита.

    git merge --no-commit feature-branch
    
  • --abort: Прерывает слияние и возвращает репозиторий в состояние до начала слияния.

    git merge --abort
    

Пример работы с конфликтами

  1. Выполните git merge:

    git merge feature-branch
    
  2. Если возникли конфликты, Git уведомит вас об этом. Разрешите конфликты, отредактировав соответствующие файлы.

  3. После разрешения конфликтов добавьте изменённые файлы:

    git add <файл-с-конфликтом>
    
  4. Завершите процесс слияния:

    git commit
    

Примечание

Использование git merge может привести к конфликтам, если изменения в целевой ветке пересекаются с вашими локальными изменениями. В этом случае вам придётся разрешить конфликты вручную.

1 - Как влить одну ветку в другую?

Шаг 1: Откройте терминал (командную строку)

Для начала откройте терминал (на Windows это может быть Git Bash, Command Prompt или PowerShell, на macOS и Linux это Terminal).

Шаг 2: Перейдите в папку вашего локального репозитория

Используйте команду cd, чтобы перейти в директорию вашего локального репозитория. Например:

cd путь/к/вашему/репозиторию

Шаг 3: Проверьте наличие веток

Используйте команду git branch, чтобы увидеть список всех локальных веток. Ветка, в которой вы находитесь в данный момент, будет отмечена звездочкой (*).

git branch

Шаг 4: Переключитесь на целевую ветку

Переключитесь на ветку, в которую вы хотите влить изменения (это будет целевая ветка). Например, если вы хотите слить изменения в ветку main, используйте команду:

git checkout main

Шаг 5: Выполните слияние

Теперь выполните слияние ветки, изменения из которой вы хотите влить. Например, если вы хотите влить изменения из ветки feature-branch в текущую ветку (в данном случае main), используйте команду:

git merge feature-branch

Шаг 6: Разрешите конфликты (если есть)

Если в процессе слияния возникли конфликты, Git сообщит вам об этом. Вы увидите файлы с конфликтами, которые нужно разрешить вручную. Откройте эти файлы и внесите необходимые изменения, чтобы разрешить конфликты. Затем добавьте эти файлы для коммита:

git add <имя-файла>

Шаг 7: Завершите слияние

После разрешения всех конфликтов завершите слияние, выполнив коммит (если это необходимо):

git commit -m "Resolved merge conflicts"

Если конфликтов не было, коммит будет выполнен автоматически, и этот шаг можно пропустить.

Шаг 8: Проверьте статус

Проверьте статус вашего репозитория, чтобы убедиться, что слияние прошло успешно:

git status

Теперь вы успешно слили две ветки в Git. Ветка feature-branch теперь влита в ветку main (или в ту ветку, в которую вы производили слияние).

2 - Как разрешить конфликты при слиянии (merge)?

Шаг 1: Запустите слияние

Начните слияние, как обычно, например:

git merge feature-branch

Если возникают конфликты, Git остановит процесс слияния и укажет файлы с конфликтами.

Шаг 2: Проверьте файлы с конфликтами

Используйте команду git status, чтобы увидеть список файлов с конфликтами:

git status

Файлы с конфликтами будут отмечены как “both modified”.

Шаг 3: Откройте файл с конфликтом в текстовом редакторе

Откройте файл с конфликтом в вашем текстовом редакторе. Конфликтующие части будут помечены следующим образом:

<<<<<<< HEAD
Текущие изменения (из текущей ветки)
=======
Изменения из ветки, которую вы сливаете (feature-branch)
>>>>>>>

Пример:

<<<<<<< HEAD
Это строка из текущей ветки (main).
=======
Это строка из сливаемой ветки (feature-branch).
>>>>>>>

Шаг 4: Разрешите конфликт

Разрешите конфликт, выбрав или объединив изменения. Удалите конфликтующие метки (<<<<<<<, =======, >>>>>>>). Например:

Это строка из текущей ветки (main), объединенная с изменениями из feature-branch.

Или выберите одно из изменений:

Это строка из текущей ветки (main).

Или:

Это строка из сливаемой ветки (feature-branch).

Шаг 5: Добавьте исправленные файлы

После разрешения конфликтов и сохранения изменений добавьте исправленные файлы в индекс:

git add <имя-файла>

Сделайте это для каждого файла с конфликтом.

Шаг 6: Завершите слияние

После добавления всех файлов завершите процесс слияния. Если конфликтов не было, слияние завершится автоматически. В противном случае выполните коммит для завершения слияния:

git commit -m "Resolved merge conflicts"

Шаг 7: Проверьте статус

Проверьте статус вашего репозитория, чтобы убедиться, что все конфликты были разрешены и слияние завершено:

git status

Дополнительные советы

Эти шаги помогут вам успешно разрешить конфликты при слиянии веток в Git.

3 - Какие у команды merge есть флаги?

Команда git merge используется для слияния веток в Git, и она поддерживает несколько флагов, которые могут изменить поведение команды в зависимости от ваших потребностей. Вот основные флаги, которые можно использовать с командой git merge:

Основные флаги к команде git merge

--no-ff

Отключает fast-forward слияние, создавая всегда новый коммит слияния, даже если слияние может быть выполнено как fast-forward. Это полезно для сохранения истории всех слияний.

git merge --no-ff <ветка>

--ff

Разрешает fast-forward слияние, если это возможно. Это значение используется по умолчанию.

git merge --ff <ветка>

--ff-only

Принудительное использование fast-forward слияния. Если fast-forward невозможно, слияние будет прервано.

git merge --ff-only <ветка>

--squash

Объединяет изменения из целевой ветки в текущую рабочую директорию, но не создаёт коммит слияния. После этого вам нужно вручную закоммитить изменения.

git merge --squash <ветка>

--no-commit

Выполняет слияние, но не делает коммит автоматически. Это позволяет вам сделать дополнительные изменения перед созданием коммита.

git merge --no-commit <ветка>

--commit

Принудительное создание коммита после слияния. Обычно это поведение по умолчанию, если не используется флаг --no-commit.

git merge --commit <ветка>

--edit или -e

Открывает редактор для изменения сообщения коммита слияния. Это значение используется по умолчанию.

git merge --edit <ветка>

--no-edit

Пропускает открытие редактора и использует стандартное сообщение коммита для слияния.

git merge --no-edit <ветка>

--log или --no-log

Включает (или отключает) добавление сообщений коммитов из целевой ветки в сообщение коммита слияния.

git merge --log <ветка>
git merge --no-log <ветка>

-m <msg>

Указывает сообщение коммита слияния в командной строке, вместо открытия редактора.

git merge -m "Ваше сообщение коммита" <ветка>

--strategy или -s

Указывает стратегию слияния, такую как resolve, recursive, octopus, ours, или subtree.

git merge -s recursive <ветка>

--strategy-option или -X

Передаёт дополнительные параметры выбранной стратегии слияния.

git merge -X theirs <ветка>

--abort

Прерывает слияние и возвращает репозиторий в состояние до начала слияния. Используется, если во время слияния возникли конфликты и вы хотите отменить процесс.

git merge --abort

Примеры использования

  1. Слияние без fast-forward:

    git merge --no-ff feature-branch
    
  2. Слияние с ручным коммитом:

    git merge --no-commit feature-branch
    
  3. Принудительное использование fast-forward:

    git merge --ff-only feature-branch
    
  4. Использование стратегии слияния “ours”:

    git merge -s ours feature-branch
    
  5. Слияние с сообщением коммита из командной строки:

    git merge -m "Слияние ветки feature-branch" feature-branch
    

Теперь вы знаете основные флаги, которые можно использовать с командой git merge 🚀