Mercurial, конфликт, слияние, дальнейшие конфликты позже, помнит ли Mercurial первоначальное разрешение?
-
26-09-2019 - |
Вопрос
Представьте себе такой сценарий:
- Алиса и Боб клонируют центральный главный репозиторий Mercurial, содержащий 1 текстовый файл.
- И Алиса, и Боб вносят изменения в одну и ту же строку файла и фиксируют
- Боб отправляет обратно в центральный репозиторий, но не Алису.
- Теперь Алиса заходит в свой репозиторий, замечает, что у нее теперь две головы, и объединяет
- Поскольку слияние является конфликтом, она разрешает конфликт.
- Затем Алиса фиксирует, но не нажимает
- Боб теперь вносит дальнейшие изменения в файл в каком-то другом месте файла (т.далеко не первоначальные изменения) и фиксирует и отправляет
- Алиса в своем объединенном файле делает аналогичные изменения в том же месте, которое только что изменил Боб, и фиксирует
- Алиса тянет и, обнаружив еще одно двуглавое хранилище, сливает
Вот другой взгляд на приведенный выше сценарий.
(цифры после «ИЗМЕНИТЬ» означают, что человек изменил «часть X» файла.Если оба пользователя изменили одну и ту же часть, впереди конфликт слияния, если изменили разную, то не так сильно)
Alice Bob CLONE MASTER CLONE MASTER ----------------------------------------- CHANGE 1 <-----+ COMMIT +-- upcoming merge conflict ----------------------------------------- | CHANGE 1 <-----+ COMMIT PUSH ----------------------------------------- PULL <-- Bob's change +1 head MERGE <-- Attempt to get rid of extra head RESOLVE CONFLICT <-- Resolve merge conflict COMMIT ----------------------------------------- CHANGE 2 <-----+ COMMIT +-- yet another merge PUSH | conflict ahead ----------------------------------------- | CHANGE 2 <-----+ COMMIT PULL <-- Bob's change, again +1 head MERGE <-- Attempt to get rid of extra head RESOLVE ???
На данный момент мой вопрос заключается в следующем:
- Будут ли инструменты слияния учитывать ее первое решение о слиянии?Поскольку Боб никогда не вносил изменения Алисы, его копия по-прежнему лишена каких-либо изменений, внесенных Алисой, ее первоначального изменения (которое противоречило изменениям Боба), ее слияния и ее последнего изменения, которое противоречит последнему изменению Боба. .
Если бы я просто взял версию файла Боба и версию файла Алисы и передал ее любой программе слияния, она пометила бы оба изменения как конфликтующие.
Другими словами, будет ли инструмент разрешения конфликтов пытаться попросить Алису разрешить как исходный конфликт, так и новый, или только последний?
Я догадываюсь (Я не пробовал это, все еще пытаюсь создать какой-то тестовый скрипт для проверки этой проблемы.), что Mercurial попросит Алису только разрешить последний конфликт.
Что, если я настрою Mercurial на использование сторонней программы сравнения/слияния?Будет ли это по-прежнему применяться?Например, я настроил свою установку на использование Вне всякого сравнения, будут ли два файла (Боба только с его изменениями и Алисы с ее изменениями + разрешение слияния) предоставлены с первоначальным разрешением или без него?Другими словами, если использовать Вне всякого сравнения, произойдет ли и здесь правильная вещь (при условии, что она вообще произойдет.)
Решение
Mercurial потребует только разрешения последнего конфликта, и это прекрасно работает с внешними инструментами изменений.
Когда Алиса выполняет свое второе слияние, она объединяет свое предыдущее слияние с новой дельтой Боба, и только это изменение необходимо интегрировать заново.
Действительно понятная схема, кстати.Спасибо
Другие советы
Он всего лишь попросит Алису изменить последний конфликт.
Причина этого заключается в следующем:
У нее уже есть CHANGE 1 от BOB, он находится в ее истории, поэтому он не будет снова пытаться изменить этот код.Оно работает.