Как работает команда git merge при слиянии веток?

«Как работает команда git merge при слиянии веток?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

git merge объединяет изменения из одной ветки в другую. Процесс зависит от истории коммитов и наличия конфликтов.

1. Fast-forward merge Если целевая ветка (например, main) не имеет новых коммитов после создания feature-ветки:

git checkout main
git merge feature  # Просто перемещает указатель main вперёд

История остаётся линейной, коммит слияния не создаётся.

2. Recursive merge (3-way merge) Если обе ветки имеют изменения, Git находит общего предка и создаёт коммит слияния:

git checkout main
git merge feature  # Создаёт новый коммит слияния

3. Конфликты слияния Возникают, когда в обеих ветках изменены одни и те же строки в файле:

// Ветка feature: изменили метод
public void calculate() {
    System.out.println("New logic");
    return new Result();
}

// Ветка main: изменили тот же метод
public void calculate() {
    System.out.println("Old logic");
    return null;
}

Git сообщит:

Auto-merging Calculator.java
CONFLICT (content): Merge conflict in Calculator.java
Automatic merge failed; fix conflicts and then commit the result.

Файл будет содержать маркеры конфликта:

public void calculate() {
<<<<<<< HEAD
    System.out.println("Old logic");
    return null;
=======
    System.out.println("New logic");
    return new Result();
>>>>>>> feature
}

4. Разрешение конфликтов

  1. Вручную отредактируйте файл, убрав маркеры и выбрав нужный код
  2. Добавьте файл в индекс: git add Calculator.java
  3. Завершите слияние: git commit

5. Стратегии слияния

  • --no-ff — всегда создавать коммит слияния (даже при возможности fast-forward)
  • --squash — объединить все коммиты feature-ветки в один перед слиянием
  • --abort — отменить слияние в случае проблем