November 27, 2022

Как c git диагностировать конфликтные изменения в проекте до их возникновения

Рассмотрим, поведение Git, когда вы работаете с файлами проекта, в которые постоянно заливаются новые правки. Кроме того, расскажем как определить вносимые изменения до их мерджа и возникновения конфликтов.

Пусть у нас есть два репозитория, связанных с одним удаленным. Создадим в первом файл 1.txt и закоммитим его:

Создадим аналогичный файл 2.txt, добавим изменения в коммит и запушим все в удаленный репозиторий:

Теперь перейдем в другой проект, добавим файл 1.txt с другим содержанием:

Скачаем изменения с сервера:

Чтобы посмотреть, какие изменения вносятся коммитами удаленной ветки, воспользуйтесь командой git log (git log -p main..origin/main):

git diff с аналогичным синтаксисом покажет все расхождения сразу (git diff main..origin/main):

Теперь попытаемся внести новые изменения в локальную ветку:

В 1.txt разрешим конфликт, оставив свою версию строки, а в файле 2.txt создадим тоже отличную от удаленной версию строки:

После в первом репозитории внесем изменения в файл 2.txt и отправим их на сервер:

Скачиваем обновления во втором репозитории:

Смотрим на изменения:

с git log:

с git diff:

Пробуем смержить ветку:

Как можно заметить, проблема только во втором файле, так как в первом конфликт мы уже разрешали и, несмотря на расхождения в снимках, изменения не затронут этот файл. Обратите внимание, что git diff (в отличие от git log) показывает все несоответствия, даже разрешенные ранее и не оказывающие влияния на процесс объединения.

Однако, если файл 1.txt будет изменен, придется опять разрешать конфликт:

Посмотрим на нововведения во втором репозитории:

Пробуем смерджить и сталкиваемся с проблемами с файлом 1.txt: