Ртутный коммит исчез

Мы недавно перешли на Mercurial. Все шло хорошо, пока у нас не было двух случаев пропажи совершенных изменений. Изучение журналов не сделало нас мудрее.

Ниже приведен пример. Файлы, зафиксированные в (1), возвращаются в предыдущее состояние в (2), даже если эти файлы не упоминаются в слиянии.

Что я могу проверить, чтобы понять, почему файлы восстановлены?

http://i43.tinypic.com/1f8ruq.png

2 ответа

Решение

На этом графике есть три интересных набора изменений, которые могут повлиять на слияние (2):

  • Набор изменений чирка: не показан, но выглядит так, будто он чуть ниже графика. Это первый родитель (2)
  • Синяя смена: номер пять снизу с надписью "Исправить тест". Это второй родитель (2).
  • Общий предок родителей: также не показан, будет далее ниже. Как ни странно, похоже, что чередование чирков могло быть общим предком, но Mercurial теперь позволит вам сделать такое вырожденное слияние при нормальных обстоятельствах.

Когда Mercurial выполняет слияние, важны только три набора изменений: две головы, которые вы объединяете, и их общий предок. В трехстороннем слиянии логика теперь такова:

ancestor  parent1  parent2  =>  merge
X         X        Y            Y (clean)
X         Y        X            Y (clean)
X         Y        Y            Y (clean)
X         Y        Z            W (conflict)

Прочитайте таблицу так: "если предок был Xи первый родитель был также X а второй родитель Yтогда слияние будет содержать Y"Другими словами: трехстороннее слияние способствует изменению и позволит выиграть модификацию.

Вы можете найти предка с

$ hg log -r "ancestor(p1(changeset-2), p2(changeset-2))"

где changeset-2 тот, который отмечен (2) выше. Когда ты сказал

Файлы, зафиксированные в (1), возвращаются в предыдущее состояние в (2), даже если эти файлы не упоминаются в слиянии.

тогда важно понимать, что "слияние" - это просто снимок, который показывает, как смешать два других набора изменений. Изменение, внесенное "в" слиянии, является разницей между этим снимком и его двумя родительскими наборами изменений:

$ hg status --rev "p1(changeset-2):changeset-2"
$ hg status --rev "p2(changeset-2):changeset-2"

Это показывает, как набор изменений слияния отличается от своего первого и второго родителя соответственно. Я уверен, что файлы упоминаются в одном из этих списков - если слияние не является виновником в конце концов.

Когда вы изучите три набора изменений и различия между ними, вы, вероятно, увидите, что кто-то должен разрешить конфликт (четвертая строка в таблице слияния выше) и на каком-то этапе выбрал неправильный файл.

Слияние в точке 2 происходит между очень старой веткой (темно-синей, разветвленной от основной линии / зеленой ветки сразу после коммита 1) и даже более старой веткой (светло-синей, не синхронизировалась с основной линией с момента до фиксации 1)

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

Отредактировано, чтобы добавить:

Чтобы помочь отследить, что именно изменилось на 2, вы можете использовать hg diff -r REV1 -r REV2, который покажет вам построчную разницу между любыми двумя ревизиями.

Когда вы знаете, что зло было введено где-то между пунктом 1 и пунктом 2, hg bisect может помочь вам отследить точный источник зла:

hg bisect [-gbsr] [-U] [-c CMD] [REV]

поиск подразделений наборов изменений

This command helps to find changesets which introduce problems. To use,

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

Bisect обновит ваш рабочий каталог до версии для тестирования (если не указана опция -U/- noupdate). После того, как вы выполнили тесты, пометьте рабочий каталог как хороший или плохой, и bisect либо обновит другой набор изменений кандидата, либо объявит, что обнаружил плохую ревизию.

Другие вопросы по тегам