Это вопрос наилучшей практики, и я ожидаю, что ответ будет "это зависит". Я просто надеюсь узнать больше реальных сценариев и рабочих процессов.
Прежде всего, я говорю о разных изменениях для одного и того же проекта, поэтому нет подрепо.
Скажем, у вас есть база кода в репозитории hg. Вы начинаете работать над сложной новой функцией A, тогда сложный баг B сообщается вашим доверенным тестером (у вас есть тестеры, верно?).
Это тривиально, если (исправление для) B зависит от A. Вы просто используете ci A, а затем ci B.
Мой вопрос заключается в том, что делать, когда они независимы (или, по крайней мере, сейчас).
Я могу думать о следующих путях:
- Используйте отдельный клон для B.
- Использовать анонимные или именованные ветки или закладки в том же репозитории.
- Используйте MQ (с патчем B поверх A).
- Используйте разветвленную MQ (я объясню позже).
- Используйте несколько MQ (начиная с версии 1.6)
1 и 2 покрываются отличный блог от @Steve Losh, связанного с слегка связанные вопросы.
Одно огромное преимущество 1 по сравнению с другими вариантами заключается в том, что он не требует каких-либо перестроек, когда вы переключаетесь с работы на одну вещь на другую, потому что файлы физически разделены и независимы. Таким образом, это действительно единственный выбор, если, например, A и/или B затрагивает заголовочный файл, который определяет трехуровневое логическое значение и включается тысячами C файлов (не говорите мне, что вы не видели такой унаследованный код основание).
3, вероятно, самый простой (с точки зрения настройки и накладных расходов), и вы можете перевернуть порядок A и B, если B - небольшое и/или срочное решение. Однако может оказаться сложным, если A и B касается одного и того же файла (ов). Легко исправить патч-хаки, которые не применимы, если изменения A и B ортогональны внутри одного и того же файла (ов), но концептуально это все еще немного рискованно.
4 может сделать вас головокружение, но это самый мощный и гибкий и масштабируемый способ. Я по умолчанию hg qinit
с -c
, так как я хочу отмечать незавершенные исправления и нажимать/вытаскивать их, но для этого требуется концептуальный скачок, чтобы понять, что вы можете также встраиваться в репит MQ. Вот шаги (mq = hg -mq):
-
hg qnew bugA
; внести изменения для A;hg qref
-
mq branch branchA; hg qci
-
hg qpop; mq up -rtip^
-
hg qnew bugB
; внести изменения для B;hg qref
-
mq branch branchB; hg qci
- Чтобы снова работать с A:
hg qpop; mq up branchA; hg qpush
Кажется сумасшедшим сделать так много шагов, и всякий раз, когда вам нужно переключать работу, вы должны hg qci; hg qpop; mq up <branch>; hg qpush
. Но учтите следующее: в одном репозитории есть несколько названных ветвей релиза, и вам нужно одновременно работать над несколькими проектами и исправлениями ошибок для всех (вам лучше получить гарантированный бонус за такую работу). Вы бы очень скоро потерялись с другими подходами.
Теперь мои друзья-любители hg, есть ли другие/лучшие альтернативы?
(ОБНОВЛЕНИЕ) qqueue
почти делает # 4 устаревшим. См. Стихотворное описание Стива Лоша здесь.