Mercurial: переключить рабочий каталог в ветку без потери изменений?
Скажем, что у меня есть именованная ветвь "B1", на которой я занимаюсь разработкой функций.
Я нахожусь в хорошей остановке перед демонстрацией, но не выполнил эту функцию, поэтому я:
hg up default
hg merge B1
hg ci -m "merged in feature drop"
hg push
Теперь я продолжаю работать полчаса или около того и перехожу к фиксации только для того, чтобы понять, что я забыл обновиться до B1 и что мой текущий рабочий каталог находится на default
- uhoh. Теоретически я должен иметь возможность просто пометить родительский родительский каталог как кончик B1 - есть ли простой способ сделать это?
Я мог бы, конечно, зафиксировать, обновить обратно до B1 и снова объединить мои изменения, но тогда есть неустойчивый набор изменений по умолчанию, и это часто случается для меня настолько, что я бы хотел найти реальное решение.
Ответы
Ответ 1
Два способа. Во-первых, очевидный способ:
hg diff > foo
hg up -C b1
hg import --no-commit foo
rm foo
Во-вторых, магический способ:
hg up -r 'ancestor(., b1)' # take working dir back to the fork point
hg up b1 # take it forward to the branch head
Этот способ включает слияния. В зависимости от того, насколько ваши ветки расходятся, это может быть безболезненным. Или это может быть сложно, и вы можете сделать беспорядок своих изменений, которые вы нигде не сохранили. Вот почему даже волшебники, подобные мне, предпочитают делать это первым путем.
Ответ 2
Я бы использовал расширение полки. Я думаю, что он распространяется вместе с TortoiseHg, вы также можете использовать его из пользовательского интерфейса:
hg shelve --all
hg up B1
hg unshelve
Ответ 3
Как правило, для такого рода динамического подхода я предпочитаю очередности в отношении меркурий.
В вашей ситуации, что бы я сделал, было бы создать патч по умолчанию с изменениями, отключить патч, переключиться на B1 и применить патч.
Это выглядит примерно так:
hg qnew OOPSPATCH
hg qrefresh
hg qpop
hg up B1
hg qpush
<hack hack>
hg qrefresh
hg qfinish
Ответ 4
Расширение базы данных позволяет вам изменять родительский элемент для любого фиксации для ошибочно настроенного набора изменений.
Если вы хотите просто изменить ветвь для будущей фиксации - MQ (как указано) или Shelve