Выполнение без частичного совершения "меркуриального пути"

Магазин Subversion рассматривает возможность перехода на Mercurial, пытаясь заранее выяснить, какие будут жалобы разработчиков. Там один довольно распространенный случай использования, который я не вижу, как обращаться.

  • Я работаю над довольно большой функцией, и у меня есть значительная часть кода - или, возможно, несколько значительных частей кода - на кусках по всему гаражному полу, совершенно непригодная для проверки, возможно, даже не компиляция.
  • Входит срочный запрос на исправление ошибок. Исправление является хорошим и локальным и не касается какого-либо кода, над которым я работал.
  • Я делаю исправление в своей рабочей копии.

Теперь что?

Я просмотрел "изменения меркуриальной вишни для фиксации и "лучшие практики в mercurial: branch vs. клонирование и частичные слияния? ", и все предложения, похоже, являются расширениями различной сложности: от Record и Shelve до Queues.

Тот факт, что, по-видимому, не существует какой-либо основной функциональности, вызывает у меня подозрение, что в некотором смысле этот рабочий стиль - это Doing It Wrong. Как выглядят похожие на Mercurial решения для этого случая использования?


Отредактировано для добавления: git, напротив, похоже, предназначено для этого рабочего процесса: git add файлы исправлений, не git add ничего другого (или git reset HEAD что угодно уже добавлены), git commit.

Ответы

Ответ 1

Вот как бы я справился с этим случаем:

  • имеют ветвь dev
  • имеют ветки функций
  • имеют личную ветку
  • имеют устойчивую ветвь.

В вашем сценарии я часто бывал в своем ветке с ветки функции.

Когда запрос вошел, я бы hg up -r XYZ, где XYZ - это номер оборота, который они запускают, а затем отделяет от него новую ветвь функции (или up branchname, что угодно).

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

Вернитесь к моей работе и слейте верхнюю ветвь фиксации функции node, тем самым объединив два потока усилий.

Ответ 2

Множество полезных функций для Mercurial предоставляется в виде расширений - не бойтесь их использовать.

Что касается вашего вопроса, record предоставляет то, что вы называете частичной фиксацией (он позволяет вам выбирать, какие блоки изменений вы хотите совершить). С другой стороны, shelve позволяет временно сделать вашу рабочую копию чистой, сохраняя изменения локально. После того, как вы зафиксируете исправление ошибки, вы можете удалить изменения и продолжить работу.

Канонический способ обойти это (т.е. использовать только ядро), вероятно, должен был сделать клон (обратите внимание, что локальные клоны дешевы, поскольку вместо копий создаются жесткие ссылки).

Ответ 3

Вы клонируете репозиторий (т.е. создадите ветвь с исправлением ошибок в терминах SVN) и выполните исправление оттуда.

Альтернативно, если это действительно быстрое решение, вы можете использовать параметр -I для фиксации для явной проверки отдельных файлов.

Ответ 4

Как и любой DVCS, ветвление - ваш друг. Разделение репозитория несколькими способами - это хлеб и масло этой системы. Здесь git model вы можете подумать о том, чтобы принять это, что хорошо работает с Mercurial.

Ответ 5

В дополнение к что сказал Санта о ветвлении, являющемся вашим другом...

Маленькая гранулярность совершает ваш друг. Вместо того, чтобы делать много изменений кода в одном коммите, сделайте каждое логически самодостаточное изменение кода в его собственном коммите. Тогда будет намного легче черемухать изменения для слияния между ветвями.

Ответ 6

Не используйте Mercurial без использования Mq Extension (он поставляется с предустановленной установкой по умолчанию). В дополнение к решению вашей конкретной проблемы, он решает множество других общих проблем и действительно должен быть стандартным способом работы (особенно если вы используете среду IDE, которая не интегрируется напрямую с Hg, что делает переключение ветвей на лету трудный способ работать).