Это не обычный режим работы Mercurial (или git). Репозиторий может содержать набор изменений только в том случае, если он также содержит всех его предков. Таким образом, вы не можете получить D в репо, не имея там A, B и C.
Так вот:
Что вы должны были сделать
Контролируйте происхождение ваших ревизий. Не делайте C родителем D только потому, что вы исправили D после C. Прежде чем исправить ошибку hg update
в предыдущем выпуске.
Представьте, что A - это релиз, а B, C и D - исправления ошибок. Если вы делаете такой цикл:
foreach bug you have:
hg update A
... fix bug ...
hg commit
hg merge # merges with the "other" head
тогда вы получите такой график:
---[A]----[B2]--[C2]--[D2]----
| / / /
+-[B] / /
| / /
+-----[C] /
| /
+---------[D]
и теперь, если вы хотите создать релиз только с, скажем, B и D, вы можете сделать:
hg update B
hg merge D
и это создает новую голову, у которой есть A + B + D, но нет C.
Tl; Dr: сделайте так, чтобы родитель изменения был как можно раньше в истории, а не то, что в данный момент является tip .
Что вы можете сделать сейчас
Это идеал, но, к счастью, это не так уж важно. Вы никогда не сможете передать точно D без C (поскольку хэш C является частью вычисления хэша D), но вы можете достаточно легко перенести работу, находящуюся в D, в новую голову. Вот несколько способов, каждый из которых будет работать:
- экспорт ртутного столба / импорт ртутного столба
- рт.ст. трансплантат
- ртутный трансплантат (новый в 2.0)
- hg rebase (возможно, только если вы еще не нажали)
Любой из них позволит вам перенести этот патч / дельту, находящуюся в D, на другой - у него будет другой хэш-идентификатор, и когда однажды вы объедините D в режиме реального времени (используя слияние), вы получите дублирующую работу в двух разных наборы изменений, но слияние решит все это.