Лучшие практики контроля вариантов

Я просто сделал движение к контролю вариантов на днях, и после неудачного опыта с Подрывной деятельностью, я переключился на Подвижный, и до сих пор доволен им.

Хотя я понимаю и ценю идею контроля вариантов, у меня действительно нет практического опыта с ним.

Прямо сейчас я использую его для пары веб-сайтов, я продолжаю работать, и пара вопросов пришла на ум:

  • Когда/как часто я должен передать? После какого-либо существенного изменения, работает ли это или нет? Когда я сделан в течение ночи? Только, когда это достигает, это - затем стабильное повторение? После какого-либо bugfixes?
  • Я отклонился бы, когда я хотел, скажем, изменить расположение меню, затем слиться, въезжают задним ходом?
  • Я должен ветвиться? Каково различие (для просто меня, одинокого разработчика) между переходом, тогда слияние въезжают задним ходом, и клонирование хранилища и задержка это в?

Совет для версии управляет новичком?


До сих пор все дали мне хороший совет, но очень ориентировали командой. Я хотел бы разъясниться:

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

Кроме того, так как я использую PHP на территориях, нет никакого компилирования, которое будет сделано.

Это значительно изменяет Ваши ответы?

26
задан Austin Hyde 3 January 2010 в 19:21
поделиться

7 ответов

Большинство вопросов, которые вы задаете, в основном зависит от того, с кем вы работаете. Если вы разработчик-одиночка, это не должно иметь большого значения, поскольку вы можете делать все, что захотите. Но если вы находитесь в команде, где вам нужно поделиться своим кодом, вам следует обсудить с членами своей команды, каким должен быть кодекс поведения , поскольку обмен изменениями между собой иногда может стать сложной задачей.

Обсуждение кодекса поведения не должно быть длительным, оно может быть очень кратким; пока все находятся на одной странице о том, как использовать репозиторий, совместно используемый программистами в команде. Если вы хотите использовать более продвинутые функции в Mercurial, такие как выбор вишни или очереди исправлений, попробуйте использовать их, чтобы это не повлияло на членов вашей команды негативным образом, например, перебазирование в общедоступном репозитории.

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

Когда и как часто мне следует совершать коммит? Будет ли это работать после любого серьезного изменения? Когда я закончу на ночь? Только когда он достигнет следующей стабильной итерации? После каких-либо исправлений?

При работе с командой существует несколько подходов, но общее правило - фиксировать рано и часто . Основная причина, по которой вы должны часто коммитить , - это упростить обработку конфликтов слияния .

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

Есть несколько исключений из правила частой фиксации, одно из которых возникает, когда у вас есть критическое изменение . хотя, если у вас есть возможность фиксировать локально (что вы делаете в Mercurial и git по сути), вы можете фиксировать критические изменения. Пока вы исправляете все, что сломалось, вам следует отправить это вверх по течению в общий репозиторий, когда вы исправите свое собственное критическое изменение.

Могу ли я разветвляться, когда я хочу, скажем, изменить макет меню, а затем снова слиться? Я должен ветвиться?

Есть много стратегий ветвления на выбор (есть статья Streamed Lines 1998 года, в которой есть исчерпывающий список шаблонов стратегий ветвления ) и когда вы делаете их для себя, это должна быть открытая игра для вас самих. Однако при работе в команде лучше открыто обсудить с командой, нужно ли вам разветвляться или нет. Всякий раз, когда у вас возникает желание разветвляться, вы должны задать себе следующие вопросы:

  • Будут ли мои будущие изменения нарушать работу других?

  • Будет ли моя команда иметь прямое негативное влияние на изменения, которые я буду делать до тех пор, пока Я закончил?

  • Мой код не используется?

Если ответ положительный на любой из приведенных выше вопросов, вы должны , вероятно, ветвиться публично или оставить его себе (поскольку вы можете сделать это в Mercurial несколькими способами). Сначала вы должны обсудить со своей командой, как выполнить всю операцию, чтобы увидеть, есть ли какой-либо другой способ сделать это, и если вы собираетесь объединить свои изменения обратно, иногда в игре есть факторы, в которых нет необходимости ветвь (это в основном связано с модульностью кода).

Когда вы решите перейти на ветку, будьте готовы обработать конфликт слияния. Разумно предположить, что тот, кто создал ветку и сделал коммиты, может объединить ее обратно в «основную ветку». В такие моменты было бы здорово, если бы каждый в команде делал соответствующие комментарии к коммитам.

В качестве примечания: вы ведь пишете хорошие комментарии к коммитам, не так ли? ВЕРНО!? Хороший комментарий коммита обычно сообщает , почему было сделано это конкретное изменение или над какой функцией работает коммиттер, вместо невзрачного комментария типа «Я сделал фиксацию». Это упрощает для того, кто обрабатывает большой конфликт слияния, выяснить, какие изменения строки можно перезаписать, а какие оставить, просматривая историю изменений.

Время компиляции или, скорее, время сборки иногда играет важную роль в обсуждении ветки, которое у вас может быть. Если у вашего проекта медленное время сборки, может быть хорошей идеей использовать промежуточную стратегию в ваших ветках. Эта стратегия учитывает, что все разработчики должны интегрироваться в «основную ветку», а одобренные изменения имеют повышенный уровень (или «продвинутый») на следующий этап, например, на стадии тестирования или выпуска. Классически это иллюстрируется именами тегов для программного обеспечения с открытым исходным кодом, например:

main -o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-> ...
         \           \              \
test      o-----------o--------------o---------> ...
           1.0 RC1     \ 1.0 RC2      2.0 RC1
release                 o----------------------> ...
                          1.0

Суть в том, что тестировщики могут работать, не прерываясь программистами, и что существует известная базовая линия для тех, кто занимается управлением выпусками. В распределенном управлении версиями разные строки могут быть клонированными репозиториями, и это может выглядеть немного иначе, поскольку репозитории совместно используют граф управления версиями. Однако принцип тот же.

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

Однако в игру вступает совсем другое - время, необходимое для развертывания сайта. По моему опыту, инструменты контроля версий действительно плохо справляются с управлением активами. Работа с художественными активами, которые в сумме составляют до нескольких ГБ, обычно является огромной проблемой в Subversion (особенно в Mercurial). Ресурсы могут потребовать от вас обработки их другим способом, который требует меньше времени, например, помещением их в общее пространство, которое синхронизируется и резервное копирование выполняется традиционным способом (художественные активы обычно не обрабатываются одновременно, как с файлами исходного кода).

В чем разница (только для меня, как разработчика-одиночки) между ветвлением, последующим слиянием, клонированием репозитория и его возвращением?

Концепции ветвления и сохранения удаленных репозиториев сейчас ближе, чем с инструменты централизованного контроля версий. Вы могли почти считать их одним и тем же. В Mercurial (и в git) вы можете "ветвиться" одним из следующих способов:

  • Клонирование репозитория

  • Создание именованной ветки

Создание именованной ветки означает, что вы создаете новый путь в управлении версиями граф репозитория, в котором вы его создаете. Создание клонированного репозитория означает, что вы копируете исходный репозиторий в новое место и создаете новый путь в графе управления версиями клонированного репозитория. Это две разные реализации ветвления как общей концепции управления версиями.

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

Поскольку просмотр веток является немного необычным для тех, кто привык к прямой линии коммитов, опытные пользователи знают, как манипулировать своими версиями, поэтому история версий "чиста", например, выбор вишни или перебазирование . На данный момент git docs довольно хорошо объясняет rebase .

25
ответ дан 28 November 2019 в 07:22
поделиться

Такова практика, которой я следую

  • Каждый коммит должен иметь смысл: одно исправление ошибки (или набор ошибок, связанных друг с другом), одна (небольшая) новая возможность и т.д. Идея заключается в том, что если вам нужно откатиться, ваши откаты попадают на четко определенные "границы"

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

  • Теперь, когда я использую git и ветки так быстро и дешево, я, как правило, делаю новую ветку для каждой новой возможности, которую я собираюсь реализовать. Я бы даже не подумал делать это для многих других VCSes. Поэтому ветвление зависит от системы, которую вы используете, вашей кодовой базы, вашей команды и т.д. Там нет жёстких правил.

  • Я предпочитаю всегда использовать командную строку и знакомиться с командами моей ВКС напрямую. Отсоединение, которое может вызвать фронтенд, основанный на GUI, может быть занозой и даже вредным. Управление вашим исходным кодом очень важно, стоит залезть туда и сделать это напрямую. Но это только мои предпочтения.

  • Сделайте резервную копию своего видеомагнитофона. Я выполняю резервное копирование моего локального репозитория с помощью Time Machine, а затем выталкиваю его в удаленный репозиторий на моем сервере, и на этом сервере также выполняется резервное копирование. Одна только VCS не является "резервной копией", она тоже может упасть, как и все остальное.

9
ответ дан 28 November 2019 в 07:22
поделиться

Когда/как часто я должен совершать коммиты?

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

Существует теория, что вы должны проверять код каждые несколько часов, даже если он не работает, но в этом случае вам придётся работать над своей собственной веткой - вы не захотите проверять испорченный код в своей основной строке или в общей ветке.

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

Что касается ветвления:

  • у вас должна быть главная строка, которая всегда содержит рабочий код.
  • у вас должна быть текущая ветка разработки, которая содержит последний код. Когда вы будете довольны этим (и она прошла все тесты), вы должны слить её обратно в основную строку.
  • вам может понадобиться ветка, содержащая последнюю выпущенную версию. Это можно использовать для тестирования/отладки ошибок и выпуска патчей (в крайнем случае).
2
ответ дан 28 November 2019 в 07:22
поделиться
  • обновление перед каждым коммитом
  • предоставление комментариев к коммиту
  • коммит, как только вы что-то закончили
  • не фиксируйте ничего, что делает код в репозитории не компилирующим или багги
  • обновление каждое утро
  • иногда устно общайтесь с коллегами, если есть что-то важное для обновления
  • коммитируйте код, относящийся точно к одной вещи (i. e. исправление ошибки, реализация возможности)
  • не волнуйтесь делать очень маленькие коммиты, если они соответствуют предыдущему правилу

Btw, что плохого в Subversion?

.
2
ответ дан 28 November 2019 в 07:22
поделиться

Я совершаю коммит, когда закончил работу, и только если она работает. Плохая практика - совершать коммиты туда, где другие люди используют код.

Бранч - это то, о чем люди будут спорить. Некоторые люди говорят, что никогда не разветвляются и у них просто есть переключатели, чтобы заставить что-то работать или нет. Делайте то, что вам удобнее, но не открывайте ветки только потому, что вы можете. Я использую ответвление и ответвление, когда работаю над большой частью работы, где если я случайно коммиттирую сломанный код, это не отразится на всех остальных.

.
2
ответ дан 28 November 2019 в 07:22
поделиться

Q: Когда/как часто я должен совершать коммиты? После любого серьезного изменения, работает это или нет? Когда я закончу на ночь? Только когда она достигнет следующей стабильной итерации? После любых исправлений?

A: Когда вы чувствуете себя комфортно, я коммитирую, как только единица работы закончена и работает (что не означает, что законченная задача должна быть закончена). Но вы не должны коммитировать что-то, что не компилируется (может помешать другим людям в команде, если таковые имеются). Кроме того, вы не должны оставлять незавершённые вещи в стволе, если есть вероятность, что вам придётся реализовать быстрое исправление или небольшое изменение перед тем, как вы его выполните.

Q: Хотел бы я создать ответвление, когда я захочу, скажем, изменить компоновку меню, а затем произвести слияние обратно?

A: Только если есть возможность, что вам придётся реализовать быстрое исправление или небольшое изменение перед тем, как вы выполните свою задачу.

Хорошая вещь в создании ответвления заключается в том, что все коммиты, которые вы делаете в ответвлении, будут всё ещё доступны для будущих ссылок (если это необходимо). Также это намного проще и быстрее, чем клонирование репо, я думаю ;-)

.
1
ответ дан 28 November 2019 в 07:22
поделиться

Я согласен с другими во время коммита.

Что касается ветвления, то я обычно создаю ветвление только тогда, когда работаю над чем-то, что нарушает то, что делают другие, или когда патч должен быть скатан в файл, в котором уже есть изменения, которые не должны быть запущены в производство. Если вы только один разработчик, то первый сценарий на самом деле не применим.

Я использую тэги для управления релизами - тэг "production" всегда связан с текущим prod кодом, и каждый релиз помечен тэгом "releasee-YYYMMDD". Это позволяет при необходимости откатиться назад

.
1
ответ дан 28 November 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: