Пример изменения, которое НЕ является конфликтом - PullRequest
11 голосов
/ 23 января 2010

Я пытаюсь понять детали команд слияния subversion. Я думаю, что понимание различия между изменением, которое также является конфликтом, и изменением, которое не является конфликтом, помогло бы.

Это продолжение этой темы .

Ответы [ 2 ]

23 голосов
/ 23 января 2010

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

1) Начнем с примера бесконфликтного слияния.

Оригинальный файл

line1
line2
line3

Персона А меняет это на:

line1CHANGED
line2
line3

Персона Б меняет это на:

line1
line2CHANGED
line3

Когда они оба отмечены и объединены, конфликт не возникает, потому что он может легко разрешить создание этого окончательного файла:

line1CHANGED
line2CHANGED
line3

Subversion будет обрабатывать это автоматически как слияние.

2) Теперь пример конфликтующих изменений.

Оригинальный файл

line1
line2
line3

Персона А меняет это на:

line1CHANGED_BY_A
line2
line3

Персона Б меняет это на:

line1CHANGED_BY_B
line2
line3

Это не может быть объединено автоматически, поэтому это конфликт. Вам нужно будет принять решение, приняв изменение лица А или лицо Б. В этом случае Subversion предупредит вас о конфликтах и ​​потребует от вас решения о том, как их разрешать.

3) Наконец, вы можете иметь как конфликтующие, так и не конфликтующие изменения в одной и той же ревизии.

Оригинальный файл

line1
line2
line3

Персона А меняет это на:

line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3

Персона Б меняет это на:

line1CHANGED_BY_B
line2
line3ALSO_CHANGED_BY_B

Теперь в этом примере оба человека изменили файл, и в строке 1 произошли конфликтующие изменения, которые должны быть разрешены, но строки 2 и 3 не являются конфликтующими изменениями и могут быть разрешены автоматически.

Вы можете решить эту проблему несколькими способами.

Во-первых, вы можете полностью принять файл A или B и отказаться от другого. Это приведет к потере неконфликтных изменений других лиц. Скажем, вы решили полностью разрешить с помощью A, ваш окончательный файл будет:

line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3

(точно файл A, и все изменения по B отбрасываются)

Во-вторых, вы можете разрешить только конфликтующие изменения и при этом сохранить все неконфликтующие изменения. Это было бы, если бы вы выбрали изменение A или B для первой строки и при этом получили оба изменения другой линии от обоих людей. Итак, скажем, например, что вы решили разрешать конфликты с помощью A, ваш конечный файл будет:

line1CHANGED_BY_A
line2ALSO_CHANGED_BY_A
line3ALSO_CHANGED_BY_B

В качестве альтернативы вы можете использовать такие инструменты, как KDiff , которые поддерживают просмотр каждого конфликта в отдельности (потому что, конечно, вы можете иметь множество изменений, как конфликтных, так и не конфликтующих, в одном файле), что позволит вам выбрать разные методы разрешения для каждого.

Если у вас возникли проблемы с пониманием слияния с инструментами командной строки, я настоятельно рекомендую вам взглянуть на KDiff (или какой-либо другой инструмент слияния / различий в GUI), так как они отображают файлы рядом друг с другом (вместе с оригиналом) и позволяют визуально, что будет делать каждое действие разрешения.

7 голосов
/ 23 января 2010

Рассмотрим функцию, подобную этой (назовите ее редакцией 1)

void foo(){
    int bar;
}

Теперь давайте предположим, что два человека вносят изменения в эту функцию, оба начиная с версии 1.

Alice:

void foo(){
    char bar;
}

Боб:

double foo(){
    double bar;
    bar = 0;
    return bar;
}

Для примера рассмотрим, что Алиса вносит свои изменения.

Теперь Боб отправляет изменения, и svn сообщит Бобу, что он устарел, и ему нужно обновить и объединить изменения. Поэтому Боб запускает обновление, и происходит слияние.

По сути, (несколько) легко увидеть, что происходит анализ, который решает, что Боб изменил из ревизии 1, а что Алиса изменила из ревизии 1. Простое слияние даст что-то вроде

double foo(){
    [conflict] bar;
    bar = 0;
    return bar;
}

Обратите внимание, что Алиса и Боб изменили тип bar с int, за исключением того, что Алиса сделала char, а Боб * double. Слияние не может решить, какой из них правильный (он не занимается анализом кода), так как человек Боб должен помочь разрешить конфликт.

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

Если бы Боб не изменил тип bar, файлы слились бы без конфликта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...