#mercurial #branch
#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
Этот способ включает слияния. В зависимости от того, насколько сильно разошлись ваши ветки, это может быть безболезненно. Или это может быть сложно, и вы можете запутать свои изменения, которые вы нигде не сохранили. Вот почему даже такие волшебники, как я, предпочитают делать это первым способом.
Комментарии:
1. только что получил
abort: patch failed to apply
, хм, ну, он сломался только на одном из трех файлов
Ответ №2:
Я бы использовал расширение shelve. Я думаю, что он распространяется вместе с TortoiseHg, вы также можете использовать его из пользовательского интерфейса:
hg shelve --all
hg up B1
hg unshelve
Комментарии:
1. У меня был неудачный опыт работы с shelve. Это адекватно, но почему-то кажется, что ошибки довольно легко сделать с помощью shelve. MQ похож, но лучше справляется с управлением исправлениями.
2. Для людей, ориентированных на визуальный интерфейс, TortoiseHg предоставляет пользовательский интерфейс для этого рабочего процесса.
3. @SteveHorn К ВАШЕМУ СВЕДЕНИЮ, THG shelve — это не то же самое, что расширение HG shelve. IMO
hg shelve
команда намного мощнее и использует встроенную логику слияния HG. Функция THG, я думаю, была старше и не так полезна.
Ответ №3:
Расширение перебазирования позволяет изменять родительский элемент для любой фиксации для ошибочно зафиксированного набора изменений.
Если вы хотите просто изменить ветку для будущей фиксации — MQ (как упоминалось) или Shelve
Ответ №4:
Обычно для такого динамического подхода я предпочитаю очереди mercurial.
В вашей ситуации я бы сделал так: создал исправление по умолчанию с изменениями, отключил исправление, переключился на B1 и применил исправление.
Это выглядит примерно так:
hg qnew OOPSPATCH
hg qrefresh
hg qpop
hg up B1
hg qpush
<hack hack>
hg qrefresh
hg qfinish
Комментарии:
1. Есть ли простой способ сделать исправление? Я ищу что-то более легкое / автоматизированное, чем копирование измененных файлов во временное местоположение, переключение, а затем перезапись этих файлов
2. @George: да, mq поддерживает исправления. Это будет выглядеть примерно так: hg qnew OOPSPATCH; hg qrefresh; hg qpop; hg up B1; hg qpush; <hack hack>; hg qrefresh; hg qfinish. Загляните в MQ.
3. Спасибо, я буду, я полагаю, MQ означает управляемые очереди? Этот парень? hgbook.red-bean.com/read /…
4. @George: Управляемые / ртутные очереди, да. обычно известен как mq.
Ответ №5:
Все, что вам нужно, это просто hg up -m B1
От hg up --help
:
options:
…
-m --merge merge uncommitted changes
…