Mercurial: переключить рабочий каталог на ветку без потери изменений? - PullRequest
25 голосов
/ 11 октября 2011

Допустим, у меня есть именованная ветка 'B1', на которой я занимаюсь разработкой функций. Я нахожусь в хорошей точке остановки перед демонстрацией, хотя не сделал с этой функцией, поэтому я:

hg up default
hg merge B1
hg ci -m "merged in feature drop"
hg push

Теперь я продолжаю работать в течение получаса или около того и продолжаю коммитить только для того, чтобы понять, что я забыл обновить обратно до B1 и что мой текущий рабочий каталог находится на default - ухо. Теоретически я должен иметь возможность просто пометить своего родителя рабочего каталога в качестве подсказки B1 - есть ли простой способ сделать это?

Конечно, я мог бы зафиксировать, обновить обратно до B1 и объединить свои изменения обратно, но по умолчанию существует нестабильный набор изменений, и это случается достаточно часто со мной, так что я бы хотел реального решения.

Ответы [ 5 ]

29 голосов
/ 11 октября 2011

Два пути.Во-первых, очевидный путь:

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

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

10 голосов
/ 12 октября 2011

Я бы использовал удлинитель полки.Я думаю, что он распространяется вместе с TortoiseHg, вы также можете использовать его из пользовательского интерфейса:

hg shelve --all
hg up B1
hg unshelve
4 голосов
/ 12 октября 2011

Расширение базы данных позволяет вам изменить родителя для любого коммита для ошибочно зафиксированного набора изменений.

Если вы хотите просто изменить ветку для будущей фиксации - MQ (как упоминалось) или Shelve

2 голосов
/ 11 октября 2011

Обычно для такого динамического подхода я предпочитаю ртутные очереди.

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

Это выглядит примерно так:

hg qnew OOPSPATCH
hg qrefresh 
hg qpop 
hg up B1 
hg qpush

<hack hack>

hg qrefresh 
hg qfinish
0 голосов
/ 15 февраля 2019

Все, что вам нужно, это просто hg up -m B1

От hg up --help:

options:  
  …  
  -m --merge      merge uncommitted changes  
  …  
...