Это вопрос наилучшей практики, и я ожидаю, что ответ будет "это зависит". Я просто надеюсь узнать больше реальных сценариев и рабочих процессов.
Прежде всего, я говорю о разных изменениях для одного и того же проекта, так что, пожалуйста, не делайте подпунктов.
Допустим, у вас есть кодовая база в репозитории hg. Вы начинаете работать над сложной новой функцией A, а ваш надежный тестировщик сообщает о сложной ошибке B (у вас есть тестеры, верно?).
Это тривиально, если (исправление) B зависит от A. Вы просто ci A, а затем c 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 устаревшим. См. Элегантное описание Стива Лоша здесь .