Непостоянная потеря кода

#version-control #mercurial

#контроль версий #непостоянный

Вопрос:

Я работаю в Mercurial и недавно перенес несколько наборов изменений в репозиторий. Другой человек слился и передал свои материалы.

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

Кто-нибудь знает, что могло здесь произойти? Я посмотрел, и 1 набор изменений выше моего не включает код. Это был набор изменений при слиянии hg.

Комментарии:

1. Во время ручного слияния слияние может удалить и неконфликтную часть кода. вам поможет hg diff. Используйте два -r или -c <набор слияний> -r <ваш родительский элемент>

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

Ответ №1:

Ни одна строка кода, которая была зафиксирована, никогда не теряется.

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

Сложность заключается в том, что обычные команды, используемые для определения того, где мог быть удален код ( hg log -p например), сравнивают набор изменений с его левым родительским элементом, поэтому вы увидите добавления и удаления только относительно этого родительского элемента.

Если, например, история выглядит следующим образом:

 [A]--[B]--[D]
        /
    -[C]-
  

(где A является родительским для обоих B и C, а D имеет двух родителей B и C)

Если изменение было добавлено в B, но левым родительским элементом D является C, а правым родительским элементом D является B, то при запуске hg log -p для просмотра исправлений вы видите:

  • A по сравнению с ничем
  • B по сравнению с A <— показывает добавленное вами изменение
  • C по сравнению с
  • D по сравнению с C

Ни один из них не покажет удаление вашего изменения. Чтобы увидеть, что вам нужен D по сравнению с B, который вы получили бы с:

 hg diff -r B -r D
  

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

Комментарии:

1. разве этого не должно быть hg diff -r B -r D ?