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

В заключении работы Вася и Петя решили внести в файл документации documentation.txt информацию о себе. Вася зафиксировал изменения на долю секунды раньше чем Петя. Петя хочет зафиксировать свои изменения

Но в результате это сделать не удается

Возникает конфликт версий файла, т.е. файл который находится в данный момент в репозитории отличается от файла, который был в репозитории при создании рабочей копии Пети. SVN предлагает Пете синхронизировать его рабочую копию с репозиторием командой Update

Петя получает конфликт файлов в своей рабочей копии. Для каждого конфликтного файла это выглядит следующим образом

В директории появились дополнительные 3 файла.

  1. documentation.txt.mine — исходный файл Пети, изменения в котором он собирался зафиксировать в репозитории
  2. documentation.txt.r13 – начальное состояние файла в репозитории, который модифицировал Петя в своей рабочей копии. Цифра означает номер ревизии файла
  3. documentation.txt.r14 –текущее состояние файла в репозитории, которое содержит изменения сделанные Васей (поэтому номер ревизии и отличается).

Сам файл помечен иконкой конфликтного файла. У Пети есть два варианта как поступить:

  1. неправильный вариант — откатить файл до исходного состояния, синхронизировать его с репозиторием и заново внести в него все изменения.
  2. правильный вариант — разрешить конфликт средствами SVN. Дополнительные файлы, которые появились в директории создаются как раз для помощи в этом.

Для разрешения конфликта Петя с помощью команды Edit Conflicts 

Cмотрит где именно возник конфликт

В TortoiseMerge видно 3 окна

  1. Mine(мой) — в окне представлен файл Пети, который находится в рабочей копии.
  2. Theirs(их) — в окне представлен файл Васи, который находится в репозитории. Этот файл не дает зафиксировать изменения Пете, так как файлы находятся в конфликте.
  3. Merged(Слитый) — в окне представлен итоговый файл, который останется после слияния файлов mine и theirs и будет зафиксирован в репозитории.
Больше:  Работа с рабочей копией SVN

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

Окна просмотра файлов синхронизированы между собой, что очень удобно для просмотра и разрешения конфликтов.

Для устранения конфликта, Петя должен в окне Merged, сформировать итоговый файл. Сделать это он может как с помощью контекстного меню окна, в котором находится (доступно по нажатию правой кнопки мыши), так и набирая в окне Merged текст в конфликтующих строках.

Конфликт также можно просмотреть и устранить напрямую в файле documentation.txt

В файле видно 3 метки

  1. <<<<<<< .mine — это изменения сделанные в Петей в рабочей копии
  2. >>>>>>> .r16 — это изменения зафиксированные Васей
  3. ======= — строка разделитель между конфликтующими строками в файле

Для разрешения конфликта в ручную, без применения средств автоматизации, нужно исправить код в файле, убрав из него все метки. Сделать это можно в любом текстовом редакторе. Но лучше для этого воспользоваться программой TortoiseMerge, которая вызывается командой Edit conflicts.

Петя решает использовать команду Edit conflicts и программу Tortoise Merge для слияния файлов.

Контекстное меню окна Merged предлагает варианты использования строк из Theirs и Mine окон, Петя выбирает команду команду Use text block from ‘theirs’ что бы вставить в итоговый файл строку из файла Васи.

И в ручную дописывает строку Васи в итоговом файле. Устранив все конфликты (в окне Merged больше нет строк красного цвета), Петя сохраняет итоговый файл и выходит из Tortoise Merge.

Что бы конфликт окончательно считался разрешенным нужно удалить все файлы, автоматически созданные для разрешения конфликта. Это можно сделать средствами операционной системы, но лучше всего это делать с помощью команды Resolved.

Все конфликт разрешен, Петя может фиксировать изменения в репозитории.

Конфликт возникает только в том случае, если два и более автора изменяют строки с одинаковыми номерами. Что и продемонстрировано в данном примере. В случае если изменяются разные строки конфликта не будет. Произойдет слияние двух файлов в один (т.е. результирующий файл будет содержать строки из обоих файлов). Надо помнить что если бинарный файл будет обрабатываться как текстовый (а SVN по умолчанию считает что все файлы текстовые), то естественно в результате будет нерабочий бинарник. Разделение бинарных и текстовых файлов рассмотрено ниже.