как часто совершать изменения в системе контроля версий?

<p>как часто мне следует вносить изменения в систему контроля версий? после каждой маленькой функции или только для больших функций?</p><p>я работаю над проектом и хочу реализовать долгосрочную функцию. в настоящее время я выполняю коммиты после каждого куска работы, т. е. каждой подфункции, реализованной и исправленной ошибки. я даже фиксирую после добавления нового фрагмента тестов для некоторой функции после обнаружения ошибки.</p><p>тем не менее, я обеспокоен этой картины. в продуктивный рабочий день я мог бы сделать 10 коммитов. учитывая, что я использую subversion, эти коммиты влияют на весь репозиторий, поэтому мне интересно, действительно ли это хорошая практика - делать так много?</p>

<p>каждый раз, когда я завершаю "полную мысль" кода, который компилируется и запускается, я регистрируюсь. это обычно заканчивается где-то между 15-60 минутами. иногда это может быть дольше, но я всегда пытаюсь проверить, есть ли у меня много изменений кода, которые я бы не хотел переписывать в случае сбоя. я также обычно проверяю, что мой код компилируется, и регистрируюсь в конце рабочего дня перед тем, как идти домой.</p><p>я бы не стал беспокоиться о том, чтобы делать "слишком много" коммитов/проверок это действительно отстой, когда вам нужно что-то переписать, и приятно иметь возможность откатывать небольшими шагами на всякий случай.</p>

<p>когда вы говорите, что обеспокоены тем, что ваши "коммиты влияют на весь репозиторий" - вы имеете в виду тот факт, что номер ревизии всего репозитория увеличивается? я не знаю, сколько битов subversion использует для хранения, но я почти уверен, что у вас не останется номер ревизии! <strong> многие коммиты не являются проблемой. </strong> вы можете фиксировать в десять раз чаще, чем сосед, и вы вообще не увеличите свой углеродный след.</p><p>одна функция или метод должны быть названы для того, что они делают, и если имя слишком длинное, оно делает слишком много. я пытаюсь применить одно и то же правило к регистрации: <strong> комментарий регистрации должен точно описывать, что изменение делает, и если комментарий слишком длинный, я, вероятно, изменяюсь слишком сильно в один раз. </strong></p>

<p>мне нравится эта небольшая статья от джеффа этвуда: <a href="http://blog.codinghorror.com/check-in-early-check-in-often/">зарегестрируйтесь рано, зарегестрируйтесь часто</a> </p>

<p>я лично фиксирую каждую логическую группу кода, которая закончена/стабильна/компилируется, и стараюсь не оставлять день без фиксации того, что я делал в тот день.</p>

<p>если вы вносите серьезные изменения и хотите повлиять на других, работающих над кодом, вы можете создать новую ветвь, а затем слиться с ней после завершения изменений.</p>

<p>я совершаю каждый раз, когда я закончу с задачей. обычно это занимает от 30 минут до 1 часа.</p>

<p>если ваш комментарий по управлению версиями длиннее одного или двух предложений, вы, вероятно, делаете это недостаточно часто.</p>

<p>не передавайте код, который на самом деле не работает. не используйте свой репозиторий в качестве решения для резервного копирования.</p><p>вместо этого, сделайте резервную копию вашего неполного кода локально в автоматическом режиме. time machine позаботится обо мне, и есть множество бесплатных программ для других платформ.</p>

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

<p>основное правило, которое я использую, - это регистрация, когда группа проверяемых файлов может быть покрыта одним комментарием о регистрации.</p><p>обычно это делается для того, чтобы проверки были атомарными, а комментарии легко усваивались другими разработчиками.</p><p>это особенно верно, когда ваши изменения влияют на файл конфигурации (такой как файл контекста spring или файл конфигурации struts), который имеет широкую область применения. если перед регистрацией сделать несколько "групп" изменений, их влияние перекрывается в файле конфигурации, в результате чего две группы объединяются друг с другом.</p>

<p>я не думаю, что вы должны беспокоиться о том, как часто. здесь важно то, что, когда и почему. сказать, что вы должны совершать каждые 3 часа или каждые 24 часа, на самом деле не имеет смысла. фиксируй, когда тебе есть что делать, не делай, если не будешь.</p><p>вот выдержка из моего <a href="http://blog.looplabel.net/2008/07/28/best-practices-for-version-control/">рекомендуемые рекомендации по управлению версиями</a> :</p><blockquote> <p><em> [...] если вы вносите много изменений в проект одновременно, разделите их на логические части и зафиксируйте их в нескольких сеансах. это значительно облегчает отслеживание истории отдельных изменений, что сэкономит вам много времени при попытке позже найти и исправить ошибки. например, если вы реализуете функции a, b и c и исправляете ошибки 1, 2 и 3, это должно привести к минимуму шести коммитов, по одному для каждой функции и по одному для каждой ошибки. если вы работаете над большой функцией или проводите обширный рефакторинг, рассмотрите возможность разделения вашей работы на еще более мелкие части и сделайте коммит после завершения каждой части. кроме того, при реализации независимых изменений в нескольких логических модулях фиксируйте изменения в каждом модуле отдельно, даже если они являются частью большего изменения. </em></p> <p><em> в идеале вы никогда не должны покидать свой офис с незафиксированными изменениями на жестком диске. если вы работаете над проектами, в которых изменения будут влиять на других людей, рассмотрите возможность использования ветки для реализации ваших изменений и объединения их обратно в ствол, когда вы закончите. при внесении изменений в библиотеки или проекты, от которых зависят другие проекты - и, следовательно, другие люди, - убедитесь, что вы не нарушаете их сборки, передавая код, который не будет компилироваться. однако наличие кода, который не компилируется, не является оправданием, чтобы избежать фиксации. вместо этого используйте ветки. [...] </em></p> </blockquote>

<p>ваш текущий шаблон имеет смысл. имейте в виду, как вы <em>используете</em> этот источник контроля: что, если вам придется откатиться, или если вы хотите сделать diff? описанные вами фрагменты в этих случаях кажутся совершенно правильным дифференциалом: diff покажет вам, что именно изменилось в реализации ошибки # (указанной в журнале регистрации), или каков новый код для реализации функции. откат, аналогично, затронет только одну вещь за раз.</p>

<p>мне также нравится совершать коммиты после того, как я закончу часть работы, которая часто происходит несколько раз в день. я думаю, что легче увидеть, что происходит в маленьких коммитах, чем в больших. если вас беспокоит слишком много коммитов, вы можете подумать о создании ветви и объединении ее с магистралью, когда вся функция будет завершена.</p><p>вот связанное сообщение в блоге: <a href="http://www.codinghorror.com/blog/archives/001165.html">ужасы кодирования: зарегестрируйтесь раньше, зарегестрируйтесь часто</a> </p>

<p>как уже говорили другие, попробуйте зафиксировать один логический фрагмент, который является "полным" настолько, чтобы он не попадал другим разработчикам (например, он собирал и проходил автоматические тесты).</p><p>каждая команда разработчиков/компания должны определить, что является "достаточно полным" для каждого филиала. например, у вас могут быть ветви функций, для создания которых требуется только код, магистраль, для которой также требуется код для прохождения автоматических тестов, и метки, указывающие, что что-то прошло qa-тестирование ... или что-то в этом роде.</p><p>я не говорю, что это хороший пример для подражания; я только указываю на то, что "сделано" зависит от политики вашей команды/компании.</p>

<p>в тот момент, когда вы думаете об этом.</p><p>(пока то, что вы регистрируете, безопасно)</p>

<p>зависит от вашей системы исходного кода и того, что еще у вас есть. если вы используете git, то фиксируйте каждый раз, когда завершаете шаг. я использую svn, и мне нравится совершать коммиты, когда я заканчиваю целую функцию, так что каждые один-пять часов. если бы я использовал cvs, я бы сделал то же самое.</p>

<p>я также люблю регулярно регистрироваться. это каждый раз, когда я делаю шаг к своей цели.</p><p>это <strong>обычно каждые пару часов</strong>.</p><p>моя трудность - найти кого-то, кто хочет и может <strong>выполнить так много обзоров кода</strong>.</p><p>политика нашей компании заключается в том, что нам необходимо пройти проверку кода, прежде чем мы сможем что-либо проверить, что имеет смысл, но в отделе не всегда есть кто-то, у кого есть время, чтобы немедленно выполнить проверку кода. возможные решения:</p><ol> <li>больше работы за регистрацию; меньше проверок == меньше отзывов.</li> <li>измените политику регистрации компании. если я только что провёл рефакторинг и все юнит-тесты стали зелеными, может я смогу ослабить правило?</li> <li>уберите изменения до тех пор, пока кто-нибудь не сможет выполнить обзор и продолжить работу. это может быть проблематично, если рецензенту не нравится ваш код, и вам нужно изменить дизайн. жонглирование различными этапами задачи с помощью "отложенных" изменений может стать грязным.</li> </ol>

<p>я согласен с несколькими ответами: не проверяйте код, который не будет компилироваться; используйте личную ветку или репозиторий, если у вас есть проблема с "резервным копированием" кода или его изменений; проверьте, когда логические единицы завершены.</p><p>еще одна вещь, которую я хотел бы добавить, это то, что в зависимости от вашей среды, скорость регистрации может меняться со временем. например, ранняя проверка проекта после завершения каждой функциональной части компонента имеет смысл как для безопасности, так и для истории изменений (я имею в виду случаи, когда более ранние биты подвергались рефакторингу по мере разработки более поздних). позже в проекте, с другой стороны, полностью полная функциональность становится более важной, особенно во время разработки/тестирования интеграции. полуинтеграция или полуфиксация никому не помогают.</p><p>что касается проверки после каждого исправления ошибки: если исправление не тривиально, абсолютно! нет ничего более болезненного, чем обнаружение того, что один чек содержал три исправления, и одно из них необходимо откатить. чаще всего кажется, что в этой ситуации разработчик исправил три ошибки в одной области и выяснил, какие изменения приводят к тому, что исправление ошибок является кошмаром.</p>

<p>мне нравится фиксировать изменения каждые 30-60 минут, если они правильно компилируются и в модульных тестах нет регрессий.</p>

<p>если вы работаете над веткой, которая не будет выпущена, коммит всегда безопасен.</p><p>однако, если вы делитесь им с другими разработчиками, фиксация нерабочего кода, вероятно, будет немного раздражать (особенно, если он находится в важном месте). обычно я фиксирую только тот код, который эффективно "работает" - не то, чтобы он был полностью протестирован, но я убедился, что он действительно компилируется и не сразу завершается с ошибкой.</p><p>если вы используете встроенный трекер ошибок, может быть полезно сделать отдельные коммиты, если вы исправили две ошибки, чтобы журнал фиксации мог идти против правильных ошибок. но с другой стороны, иногда одно изменение кода исправляет две ошибки, поэтому вам просто нужно выбрать, какую из них использовать, если ваша система не разрешает связывать один коммит с несколькими ошибками.</p>

<p>ну, у вас может быть своя собственная ветка, в которую вы можете фиксировать столько раз, сколько захотите, и когда вы закончите с вашей функцией, вы можете объединить ее с основной стволом.</p><p>что касается частоты коммитов, я думаю об этом таким образом, насколько мне будет больно, если сломается мой жесткий диск, а я что-то не совершил - для меня это примерно 2 часа работы.</p><p>конечно, я никогда не совершаю что-то, что не компилируется.</p>

<p>по крайней мере, один раз в день.</p>

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

<p>я до сих пор верю в фразу "часто совершай, делай рано". я предпочитаю децентрализованные vcs, такие как <a href="http://www.selenic.com/mercurial/wiki/">mercurial</a> , и нет проблем с фиксацией нескольких вещей и последующим их продвижением.</p><p>это действительно распространенный вопрос, но реальный вопрос: можете ли вы завершить незаконченный код?</p>

<p>вы должны сбалансировать компромисс между безопасностью и восстанавливаемостью, с одной стороны, и легкостью управления изменениями для всего проекта, с другой.</p><p>лучшая схема, которую я использовал, имела два ответа на этот вопрос.</p><p>мы использовали 2 совершенно разных репозитория: один был репозиторием всего проекта, а другой был нашим личным репозиторием (в то время мы использовали rcs).</p><p>мы будем регулярно заходить в наш личный репозиторий, почти каждый раз, когда вы сохраняете свои открытые файлы. таким образом, личный репозиторий был в основном большим буфером для удаления.</p><p>после того, как у нас был кусок кода, который должен был скомпилироваться, все было протестировано и было принято как готовое для общего использования, он был проверен в репозитории проекта.</p><p>к сожалению, эта система основывалась на использовании различных технологий vcs для обеспечения работоспособности. я не нашел удовлетворительного метода достижения одинаковых результатов при использовании двух vcs одного типа (например, два хранилища subversion)</p><p>тем не менее, я получил приемлемые результаты, создав "личные" ветки разработки в репозитории subversion - регулярно проверяя ветку и сливаясь с ней по завершении.</p>

<p>всякий раз, когда вы заканчиваете какой-то код, который работает, и никто не напортачит, если они получат его в обновлении.</p><p>и, пожалуйста, убедитесь, что вы правильно прокомментировали.</p>