Контроль версий

редактировать
Действие по управлению версией одного или нескольких файлов

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

Изменения обычно идентифицируются числовым или буквенным кодом, называемым «номером версии», «уровнем версии» или просто «версией». Например, начальный набор файлов - «версия 1». Когда сделано первое изменение, результирующим набором будет «версия 2» и так далее. Каждая редакция связана с меткой времени и лицом, вносящим изменение. Редакции можно сравнивать, восстанавливать и объединять с файлами некоторых типов.

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

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

Содержание

  • 1 Обзор
  • 2 История
  • 3 Структура
    • 3.1 Структура графика
  • 4 Специализированные стратегии
  • 5 Модели управления источниками
    • 5.1 Атомарные операции
    • 5.2 Блокировка файлов
    • 5.3 Объединение версий
    • 5.4 Базовые параметры, метки и теги
  • 6 Распределенный контроль версий
  • 7 Интеграция
  • 8 Общая терминология
  • 9 См. Также
  • 10 Примечания
  • 11 Ссылки
  • 12 Внешние ссылки

Обзор

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

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

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

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

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

История

Инструмент обновления программного обеспечения IBM OS / 360 IEBUPDTE восходит к 1962 году, возможно, он является предшественником инструментов VCS. Полная система, предназначенная для управления исходным кодом, была запущена в 1972 году, SCCS для той же системы (OS / 360). Введение SCSS, опубликованное 4 декабря 1975 года, исторически подразумевает, что это была первая преднамеренная система. Сразу после этого последовала RCS с сетевой версией CVS. В следующем поколении после CVS доминировала Subversion, за которой последовал рост распределенного контроля версий (например, git ).

Структура

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

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

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

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

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

Структура графика

Пример графа истории проекта с контролем версий; ствол выделен зеленым, ветви - желтым, а граф не является деревом из-за наличия слияний (красные стрелки).

С точки зрения теории графов, изменения обычно рассматриваются как линия развитие (ствол) с ответвлениями, образующими направленное дерево, визуализируемое как одна или несколько параллельных линий развития («основные линии» ветвей), ответвляющихся от ствола. На самом деле структура более сложная, образуя направленный ациклический граф, но для многих целей «дерево со слияниями» является адекватным приближением.

Изменения происходят последовательно с течением времени, поэтому их можно упорядочить по номеру редакции или метке времени. Редакции основаны на прошлых редакциях, хотя можно в значительной степени или полностью заменить более раннюю редакцию, например «удалить весь существующий текст, вставить новый текст». В простейшем случае, без ветвления или отмены, каждая ревизия основана только на своем непосредственном предшественнике, и они образуют простую строку с единственной последней версией, ревизией «HEAD» или подсказкой. В терминах теории графов, рисование каждой ревизии в виде точки и каждой взаимосвязи «производная ревизия» в виде стрелки (обычно указывающей от старой к новой в том же направлении, что и время), это линейный график. Если есть ветвление, то есть несколько будущих ревизий основаны на прошлой ревизии или отмене, поэтому ревизия может зависеть от ревизии, более ранней, чем ее непосредственный предшественник, тогда результирующий граф вместо этого представляет собой направленное дерево (каждая node может иметь более одного дочернего элемента) и имеет несколько подсказок, соответствующих ревизиям без дочерних узлов («последняя ревизия в каждой ветви»). В принципе, в результирующем дереве не обязательно должна быть предпочтительная подсказка («основная» последняя ревизия) - просто различные разные ревизии, но на практике одна подсказка обычно обозначается как HEAD. Когда новая ревизия основана на HEAD, она либо определяется как новая HEAD, либо считается новой ветвью. Список ревизий от начала до HEAD (в терминах теории графов, уникальный путь в дереве, который, как и раньше, образует линейный граф) является стволом или основной веткой. И наоборот, когда ревизия может быть основана на более чем одной предыдущей ревизии (когда узел может иметь более одного родителя), результирующий процесс называется слиянием и является одним из самых сложных аспектов ревизии. контроль. Чаще всего это происходит, когда изменения происходят в нескольких ветвях (чаще всего в двух, но возможно и больше), которые затем объединяются в одну ветвь, включающую оба изменения. Если эти изменения накладываются друг на друга, объединение может оказаться трудным или невозможным и потребует ручного вмешательства или перезаписи.

При наличии слияний результирующий граф больше не является деревом, поскольку узлы могут иметь несколько родителей, а вместо этого является корневым направленным ациклическим графом (DAG). График ациклический, так как родители всегда отстают во времени, и укоренен, потому что существует самая старая версия. Однако, предполагая, что существует ствол, слияния из ветвей можно рассматривать как «внешние» по отношению к дереву - изменения в ветке упаковываются как патч, который применяется к HEAD (ствола), создавая новую ревизию. без явной ссылки на ветвь и с сохранением древовидной структуры. Таким образом, хотя фактические отношения между версиями образуют DAG, это можно рассматривать как дерево плюс слияния, а сам ствол - это линия.

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

Специализированные стратегии

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

Контроль версий широко распространен в бизнесе и юриспруденции. Действительно, «красная линия контракта» и «черная линия закона» являются одними из самых ранних форм контроля над изменениями, и они все еще используются в бизнесе и праве с разной степенью сложности. Для электронного отслеживания изменений в файлах САПР (см. управление данными продукта ) начинают использоваться самые изощренные методы, заменяющие "ручное" электронное внедрение традиционного контроля версий.

Модели управления версиями

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

Атомарные операции

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

Блокировка файлов

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

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

Объединение версий

Большинство систем управления версиями позволяют нескольким разработчикам редактировать один и тот же файл одновременно. Первый разработчик, который «зарегистрировал» изменения в центральном репозитории, всегда добивается успеха. Система может предоставлять средства для слияния дальнейших изменений в центральном репозитории и сохранения изменений от первого разработчика, когда другие разработчики регистрируются.

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

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

Базовые параметры, метки и теги

Большинство инструментов управления версиями будут использовать только один из этих похожих терминов (базовый план, метка, тег) для обозначения действия по идентификации снимка («пометьте проект ") или запись снимка (" попробуйте с базовой линией X "). Обычно в документации или обсуждениях используется только один из терминов «базовый уровень», «метка» или «тег»; их можно считать синонимами.

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

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

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

Распределенный контроль версий

Распределенные системы контроля версий (DRCS) принимают одноранговую равноправный подход, в отличие от подхода клиент-сервер централизованных систем. Вместо единого центрального репозитория, в котором синхронизируются клиенты, рабочая копия кодовой базы каждого партнера является добросовестным репозиторием. Распределенный контроль версий выполняет синхронизацию путем обмена патчами (наборами изменений) от однорангового узла к одноранговому. Это приводит к некоторым важным отличиям от централизованной системы:

  • По умолчанию не существует канонической справочной копии кодовой базы; только рабочие копии.
  • Общие операции (такие как фиксация, просмотр истории и возврат изменений) выполняются быстро, потому что нет необходимости связываться с центральным сервером.

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

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

Интеграция

Некоторые из более продвинутых инструментов контроля версий предлагают множество другие средства, обеспечивающие более глубокую интеграцию с другими инструментами и процессами разработки программного обеспечения. Плагины часто доступны для IDE, таких как Oracle JDeveloper, IntelliJ IDEA, Eclipse и Visual. Студия. Delphi, IDE NetBeans, Xcode и GNU Emacs (через vc.el). Прототипы для передовых исследований генерируют соответствующие сообщения о фиксации, но это работает только с проектами с уже большой историей, поскольку сообщения о фиксации очень зависят от соглашений и особенностей проекта.

Общая терминология

Терминология могут отличаться от системы к системе, но некоторые из общих терминов включают:

Базовый уровень
Утвержденная версия документа или исходного файла, в которую могут быть внесены последующие изменения. См. базовые показатели, метки и теги.
Ветвь
Набор файлов под контролем версий может быть разветвлен или разветвлен в определенный момент времени, так что с этого момента две копии этих файлов могут развиваться в разных скорости или разными способами независимо друг от друга.
Изменение
Изменение (или diff, или дельта ) представляет собой конкретную модификацию документ под контролем версий. Степень детализации модификации, считающейся изменением, зависит от системы управления версиями.
Список изменений
Во многих системах управления версиями с атомарными коммитами с несколькими изменениями список изменений ( или CL), набор изменений, обновление или патч идентифицирует набор изменений, сделанных за одну фиксацию. Это также может представлять собой последовательное представление исходного кода, позволяющее исследовать источник по любому конкретному идентификатору списка изменений.
Оформление заказа
Отказ (или совместная работа) означает создание локального рабочего скопировать из репозитория. Пользователь может указать конкретную версию или получить самую последнюю. Термин «проверка» также может использоваться как существительное для описания рабочей копии. Когда файл был извлечен с общего файлового сервера, другие пользователи не могут его редактировать. Думайте об этом как об отеле, когда вы выезжаете, у вас больше нет доступа к его удобствам.
Клонирование
Клонирование означает создание репозитория, содержащего версии из другого репозитория. Это эквивалентно отправке или извлечению из пустого (вновь инициализированного) репозитория. Как существительное, два репозитория можно назвать клонами, если они синхронизированы и содержат одни и те же версии.
Commit (имя существительное)
'commit' или 'revision' (SVN) - это модификация, которая применяется к репозиторию.
Фиксация (глагол)
Фиксация (отметка, ci или, реже, установка, отправка или запись) означает запись или слияние изменения, внесенные в рабочую копию, возвращаются в репозиторий. Фиксация содержит метаданные, обычно информацию об авторе и сообщение фиксации, описывающее изменение.
Конфликт
Конфликт возникает, когда разные стороны вносят изменения в один и тот же документ, и система не может согласовать изменения. Пользователь должен разрешить конфликт, объединив изменения или выбрав одно изменение в пользу другого.
Дельта-сжатие
В большинстве программ управления версиями используется дельта-сжатие, который сохраняет только различия между последовательными версиями файлов. Это позволяет более эффективно хранить множество различных версий файлов.
Динамический поток
Поток, в котором некоторые или все версии файлов являются зеркалами версий родительского потока.
Экспорт
экспорт - это процесс получения файлов из репозитория. Это похоже на извлечение, за исключением того, что он создает чистое дерево каталогов без метаданных управления версиями, используемых в рабочей копии. Это часто используется, например, перед публикацией содержимого.
Fetch
См. Pull.
Прямая интеграция
Процесс объединения изменений, внесенных в основной ствол в ветвь разработки (функциональную или групповую).
Голова
Также иногда называется подсказкой, это относится к самой последней фиксации, либо в стволе, либо в ветке. Ствол и каждая ветвь имеют свой собственный заголовок, хотя HEAD иногда вольно используется для обозначения ствола.
Импорт
импорт - это копирование локального дерева каталогов (которое в настоящее время не используется рабочая копия) в репозиторий в первый раз.
Инициализировать
для создания нового пустого репозитория.
Чередующиеся дельты
некоторый контроль версий программное обеспечение использует Interleaved deltas, метод, который позволяет хранить историю текстовых файлов более эффективно, чем при использовании Дельта-сжатия.
Метка
См. тег.
Блокировка
Когда разработчик блокирует файл, никто другой не может обновить этот файл, пока он не будет разблокирован. Блокировка может поддерживаться системой контроля версий или посредством неформального общения между разработчиками (также известного как социальная блокировка).
Основная ветка
Подобно основной ветке, но может быть основная ветка для каждой ветви.
Слияние
Слияние или интеграция - это операция, в которой два набора изменений применяются к файлу или набору файлов. Вот некоторые примеры сценариев:
  • Пользователь, работающий с набором файлов, обновляет или синхронизирует свою рабочую копию с изменениями, внесенными и зарегистрированными в репозитории другими пользователями.
  • A пользователь пытается вернуть файлы, которые были обновлены другими с момента извлечения файлов, и программа управления версиями автоматически объединяет файлы (обычно после запроса пользователя, следует ли ему продолжить автоматическое объединение, а в некоторых случаях только выполняет поэтому, если слияние может быть четко и разумно разрешено).
  • Создается ветвь, код в файлах редактируется независимо, а обновленная ветвь позже включается в единую унифицированную стволу.
  • Набор файлов разветвляется, проблема, которая существовала до разветвления, устраняется в одной ветке, а затем исправление объединяется в другую ветку. (Этот тип выборочного слияния иногда называют «вишенкой», чтобы отличить его от полного слияния в предыдущем случае.)
Продвигать
Акт копирования содержимого файла из менее контролируемого места в более контролируемое местоположение. Например, из рабочей области пользователя в репозиторий или из потока в его родительский элемент.
Извлечь, нажать
Копировать версии из одного репозитория в другой. Извлечение инициируется получающим репозиторием, в то время как отправка инициируется источником. Извлечение иногда используется как синоним извлечения или для обозначения извлечения с последующим обновлением.
Репозиторий
Репозиторий (или «репо») - это место, где текущие и исторические данные файлов хранятся, часто на сервере. Иногда также называется депо.
Разрешить
Акт вмешательства пользователя для разрешения конфликта между различными изменениями одного и того же документа.
Обратная интеграция
Процесс объединения различных ответвлений группы в основной ствол системы управления версиями.
Редакция
Также версия: версия - это любое изменение формы. В SVK ревизия - это состояние на момент времени всего дерева в репозитории.
Общий доступ
Действие по обеспечению доступа к одному файлу или папке в нескольких ветвях одновременно. Когда общий файл изменяется в одной ветви, он изменяется в других ветвях.
Поток
Контейнер для разветвленных файлов, имеющий известную связь с другими такими контейнерами. Потоки образуют иерархию; каждый поток может наследовать различные свойства (например, версии, пространство имен, правила рабочего процесса, подписчики и т. д.) от своего родительского потока.
Тег
Тег или метка относится к важному моментальному снимку во времени, согласованному для многих файлов. На этом этапе все эти файлы могут быть помечены понятным, значимым именем или номером версии. См. базовые показатели, метки и теги.
Магистраль
Уникальная линия разработки, не являющаяся ветвью (иногда также называемая базовой, основной или основной)
Обновление
update (или синхронизация, но синхронизация также может означать комбинированное извлечение и извлечение) объединяет изменения, сделанные в репозитории (например, другими людьми), в локальную рабочую копию. Обновление - это также термин, используемый некоторыми инструментами CM (CM +, PLS, SMS) для обозначения концепции пакета изменений (см. Список изменений). Синоним проверки в системах контроля версий, которые требуют, чтобы у каждого репозитория была ровно одна рабочая копия (обычно в распределенных системах)
Разблокировка
снятие блокировки.
Рабочая копия
Рабочая копия - это локальная копия файлов из репозитория в определенное время или в определенную версию. Вся работа, выполняемая с файлами в репозитории, изначально выполняется на рабочей копии, отсюда и название. Концептуально это песочница.
запрос на извлечение
Разработчик, говорящий другим, чтобы они проверяли его «выдвинутые» изменения

См. Также

Примечания

Ссылки

Внешние ссылки

  • «Визуальное руководство по управлению версиями», Более подробное описание.
  • Синк, Эрик, «Управление исходным кодом», SCM (инструкции). Основы управления версиями.
Последняя правка сделана 2021-06-18 11:46:52
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте