Ответ
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. Разрешение конфликтов
- Вручную отредактируйте файл, убрав маркеры и выбрав нужный код
- Добавьте файл в индекс:
git add Calculator.java - Завершите слияние:
git commit
5. Стратегии слияния
--no-ff— всегда создавать коммит слияния (даже при возможности fast-forward)--squash— объединить все коммиты feature-ветки в один перед слиянием--abort— отменить слияние в случае проблем