Ртутная потеря кода - PullRequest
2 голосов
/ 10 ноября 2011

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

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

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

1 Ответ

4 голосов
/ 11 ноября 2011

Ни одна строка кода, которая была принята, не является когда-либо потерянной.

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

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

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

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

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

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

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

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

hg diff -r B -r D

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

...