Предыдущий ролик Следующий ролик  

Видео урок: Добавление и получение файлов из хранилища

Принципы контроля версий

Чтобы работать в системе контроля версий, вы в первую очередь должны уметь создавать либо целое хранилище, либо часть хранилища для проекта, над которым вы работаете. В централизованных системах чаще всего хранилище для вас создает системный администратор. В распределенных системах вы создаете хранилище самостоятельно, по крайней мере, на локальном компьютере. Затем вы можете синхронизировать его с другим хранилищем, которое было создано на сервере администратором. Таким образом, вы создаете хранилище с помощью команды initialize или create.

Она создает пустое хранилище, в котором вы можете сохранять ваши файлы и каталоги. Мы уже использовали ее в том примере, когда создали myprog.c и внесли ее в систему. Если ваши файлы уже существуют, то есть, вы хотите добавить существующий проект в систему контроля версий, вы можете использовать функцию Add, чтобы добавить все файлы и каталоги в рабочий набор, а затем внести изменения в систему. В распределенных системах контроля версий между файловой системой и хранилищем обычно есть буфер (staging area).

Когда вы выполняете команду add, файлы копируются из вашего рабочего набора в буфер, и только затем могут попасть в хранилище. В 99% случаев помещение файлов в буфер не выполняется как отдельная операция, что мы уже демонстрировали. Я вводил git commit -a -m, и -a значило, что нужно добавить все файлы из рабочего набора, которых еще нет в хранилище, автоматически.

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

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

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

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

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

Мы разберемся в этом подробнее, когда будем говорить о ветвлении и слиянии и выполнять ветвление и слияние в Mercurial и Git.