Ответ 1
Большинство вопросов, о которых вы спрашиваете, в основном зависит от того, с кем вы работаете. Если вы одинокий разработчик, это не должно иметь большого значения, поскольку вы можете делать все, что захотите. Но если вы находитесь в команде, где вам нужно поделиться своим кодом, тогда вы должны обсудить с членами вашей команды, что должен делать кодекс поведения, поскольку обмен изменениями между собой может иногда становиться сложным.
Обсуждение кодекса поведения не обязательно должно быть длительным, оно может быть очень кратким; пока все находятся на одной странице о том, как использовать репозиторий, который совместно используется программистами в команде. Если вы хотите использовать более продвинутые функции в Mercurial, такие как выбор вишни или очереди патчей, попробуйте использовать их, чтобы они не влияли на членов вашей команды отрицательным образом, например, на восстановление общего публичного репозитория.
Помните, что контроль версий должен быть простым в использовании для всех в команде, иначе он не будет использоваться.
Когда/как часто я должен совершать транзакции? После каких-либо серьезных изменений, работает ли это или нет? Когда я закончил на ночь? Только когда он достигнет следующей стабильной итерации? После каких-либо исправлений?
Во время работы с командой существует несколько подходов, но общее правило заключается в фиксировать раннее и часто. Основная причина того, почему вы должны фиксировать часто, - это упростить обработку конфликтов слияния.
Конфликт слияния просто добавляется, когда слияние файла, который был изменен как минимум двумя людьми, не работает, потому что они редактировались в тех же строках. Если вы держитесь за фиксацию, которая включает очень большие изменения с несколькими линиями изменений в нескольких файлах, будет очень сложно управлять получателем для управления конфликтами, которые могут возникнуть. Конфликт слияния становится еще сложнее обрабатывать, если указанный набор изменений удерживается слишком долго.
Есть некоторые исключения из правила частого совершения, а одно - всякий раз, когда у вас есть нарушение. хотя, если у вас есть возможность совершать локально (что вы делаете в Mercurial и git по существу), вы можете совершить нарушение изменений. Пока вы исправляете все, что сломалось, вы должны подталкивать его вверх по течению в общий репозиторий, когда вы исправляете свое собственное нарушение.
Отключу ли я, когда захочу, скажем, изменить макет меню, а затем снова объединиться? Должен ли я вступить?
Есть много стратегий ветвления на выбор (есть бумага Streamed Lines с 1998 года, которая имеет исчерпывающий список шаблонов стратегий ветвления), и когда вы делаете их для себя, это должна быть открытая игра для себя. Однако, работая в командах, лучше поговорить с командой, если вам нужно разветкиться или нет. Всякий раз, когда у вас возникает желание вступить, хотя вы должны задать себе следующие вопросы:
-
Могут ли мои будущие изменения нарушать работу других?
-
Будет ли моя команда иметь прямое отрицательное влияние на изменения, которые я буду делать, пока не закончится?
-
Является ли код кода для отправки кода?
Если ответ "да" в любом из вышеперечисленных вопросов, вы, вероятно, должны публиковаться в ветки или сохранить его для себя (поскольку вы можете сделать это в Mercurial несколькими способами). Вы должны сначала обсудить с вашей командой, как выполнить весь endavour, чтобы увидеть, есть ли другой способ сделать это, и если вы собираетесь снова объединить свои изменения, иногда в игре есть факторы, в которых нет необходимости (это в основном связано с тем, насколько модульным является код).
Когда вы решите, что ветка будет готова к конфликту слиянием. Здраво предположить, что тот, кто создал филиал, и сделал коммиты, чтобы иметь возможность объединить его обратно в "главную ветвь". В это время было бы здорово, если бы все в команде сделали соответствующие комментируемые комментарии.
В качестве побочного примечания: вы пишете хорошие комментарии коммита, не так ли? ПРАВИЛЬНО!? Хороший комментарий коммита обычно сообщает почему, что было сделано какое-то конкретное изменение или какая функция коммиттер работает вместо нечеткого комментария "Я сделал коммит". Это облегчает тем, кто справляется с конфликтом большого слияния, чтобы выяснить, какие изменения в строке могут быть перезаписаны и какие из них сохранить при просмотре истории изменений.
Скомпилируйте время или время сборки, а иногда играйте в дискуссию, которую вы можете иметь. Если ваш проект имеет медленное время сборки, может быть хорошей идеей использовать стратегию промежуточного этапа в ваших ветких. Эта стратегия учитывает, что все разработчики должны интегрироваться в "основную линию", а одобренные изменения повышаются (или "продвигаются" ) до следующего этапа, например, тестируют или выпускают строки. Это классически иллюстрируется именами тегов для программного обеспечения с открытым исходным кодом:
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) вы можете "разветкить" либо:
-
Клонирование репозитория
-
Создание именованной ветки
Создание именованной ветки означает, что вы создаете новый путь на графике управления версиями для создаваемого вами репозитория. Создание клонированного репозитория означает, что вы копируете исходный репозиторий в новое место и создаете новый путь в графе клонирования клонированного репозитория. Они представляют собой две различные реализации ветвления как общую концепцию контроля версий.
На практике единственное различие между обоими методами, о которых вы должны заботиться, в использовании. Вы клонируете репозиторий, чтобы иметь копию исходного кода, и у вас есть место для хранения ваших собственных изменений, и вы создаете названные ветки, когда хотите сделать небольшие эксперименты для себя.
Так как просмотр через ветки немного причудливый для тех, кто привык к прямой линии коммитов, продвинутые пользователи знают, как манипулировать их версиями, чтобы история версий была "чистой", например. выбор вишни или rebase. На данный момент git docs фактически объясняют rebase довольно хорошо.