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

Тема дорожной карты · Изучи Git

Разрешение конфликтов — это процесс, который позволяет объединить изменения из различных веток, когда они пересекаются. Этот этап является ключевым в управлении версиями, так как позволяет сохранить историю коммитов и обеспечивает целостность проекта. Конфликты возникают, когда две ветки изменяют одни и те же строки или одна удаляет файл, который другая редактирует. В таких случаях Git автоматически останавливает процесс слияния и записывает обе версии изменений в файл с маркерами конфликтов, используя специальные строки <<<<<<<, ======= и >>>>>>>.

Как это работает

Разрешение конфликтов осуществляется через команду git merge <branch>. В зависимости от того, как ветки расходились, Git может использовать два основных типа слияния: fast-forward merge и three-way merge. В случае fast-forward merge, если целевая ветка не расходилась с другой веткой, то Git просто перемещает указатель на последний коммит ветки, не создавая merge-коммита. В противном случае, если обе ветки имеют новые коммиты, Git выполняет three-way merge, создавая новый merge-коммит с двумя родителями.

Команда git merge --squash используется для слияния веток, когда все входящие коммиты сворачиваются в один. Это полезно, когда необходимо сохранить изменения в одной ветке, но не требуется создавать отдельный коммит слияния. Конфликты возникают, когда обе ветки изменяют те же строки. Git помечает конфликтные области специальными строками <<<<<<<, ======= и >>>>>>>, и разрешение конфликта требует ручного вмешательства. После редактирования конфликтных областей, необходимо удалить эти маркеры и добавить изменения в индекс с помощью команды git add <file>, а затем завершить слияние с помощью git commit или git rebase --continue.

Когда применять

Fast-forward merge используется, когда у целевой ветки нет других коммитов, что означает чистую линейную историю. Three-way merge или squash-merge применяются для объединения feature-веток в основную ветку. Выбор одного из этих стилей команды зависит от требований к истории проекта. Например, squash-merge является стандартным способом объединения веток на GitHub для чистого trunk, так как он позволяет сохранить изменения без создания отдельного коммита слияния. В то же время, merge-коммит сохраняет feature-ветку как единицу, что полезно для отслеживания истории проекта.

Типичные ошибки

При разрешении конфликтов часто встречаются ошибки, такие как удаление маркеров конфликтов без понимания, какая сторона права. Это может привести к корректировке логики одной из веток без учета изменений другой. Также часто забывают выполнить команду git merge --abort, что приводит к оставлению half-merged репозитория. Кроме того, использование merge вместо rebase для маленьких короткоживущих веток может засорить историю тривиальными merge-коммитами.

Связанные понятия

Полезные ресурсы