Mercurial: переключить рабочий каталог на ветку без потери изменений?

#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  
  …