Выполнение без частичного совершения "меркуриального пути"
Магазин 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, что делает переключение ветвей на лету трудный способ работать).