minor edit in ru/branch.txt
[gitmagic/gitmagic.git] / ru / intro.txt
blob7640616fcf9f8499d339d9b411053188c3b3def3
1 == Введение ==
3 Я буду использовать аналогии, чтобы объяснить, что такое контроль версий. Если вам нужно более точное объяснение, обратитесь к http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8F%D0%BC%D0%B8[статье википедии].
5 === Работа - это игра ===
7 Я играл в компьютерные игры почти всю свою жизнь. А вот использовать системы контроля версий я начал уже будучи взрослым. Подозреваю, что я не один такой, и сравнение этих двух занятий может помочь объяснению и пониманию концепции.
9 Представьте, что редактирование кода или документа — игра. Далеко продвинувшись, вы захотите сохраниться. Чтобы сделать это, вы нажмете на кнопку «Сохранить» в вашем любимом редакторе.
11 Но это перезапишет старую версию. Это как в древних играх, где был только один слот для сохранения: вы можете сохраниться, но вы никогда не сможете вернуться к прежнему состоянию. Это досадно, так как прежнее сохранение могло указывать на одно из очень интересных мест в игре, и, может быть, однажды вы захотите вернуться к нему. Или, что еще хуже, вы сейчас находитесь в безвыигрышном состоянии и вынуждены начинать заново.
13 === Контроль версий  ===
15 Во время редактирования вы можете «Сохранить как…» в другой файл, или скопировать файл куда-нибудь перед сохранением, чтобы уберечь более старые версии. Может быть, заархивировав их для экономии места на диске. Это самый примитивный вид контроля версий, к тому же требующий интенсивной ручной работы. Компьютерные игры прошли этот этап давным-давно, в большинстве из них есть множество слотов для сохранения с автоматическими временными метками.
17 Давайте усложним условия. Пусть у вас есть несколько файлов, используемых вместе, например, исходный код проекта или файлы для вебсайта. Теперь, чтобы сохранить старую версию, вы должны скопировать весь каталог. Поддерживать множество таких версий вручную неудобно, и это быстро становится дорогим удовольствием.
19 В некоторых играх сохранение — это и есть каталог с кучей файлов внутри. Эти игры скрывают детали от игрока и предоставляют удобный интерфейс для управления различными версиям этого каталога.
21 В системах контроля версий всё точно так же. У них у всех есть приятный интерфейс для управления каталогом с вашим скарбом. Вы можете сохранять состояние каталога так часто, как пожелаете, а затем восстановить любую из предыдущих сохраненных версий. Но, в отличие от компьютерных игр, они существенно экономят дисковое пространство. Обычно только несколько файлов меняется от версии к версии, не более. Хранение лишь различий вместо всей копии каталога требует меньше места.
23 === Распределенный контроль  ===
25 А теперь представьте очень сложную компьютерную игру. Её настолько сложно пройти, что множество опытных игроков по всему миру решили объединиться и использовать общие сохранения, чтобы попытаться выиграть. Прохождения на скорость — живой пример. Игроки, специализирующиеся на разных уровнях игры, объединяются, чтобы в итоге получить потрясающий результат.
27 Как бы вы организовали такую систему, чтобы игроки смогли легко получать сохранения других? А загружать свои?
29 Раньше каждый проект использовал централизованное управление версиями. Какой-нибудь сервер хранил все сохраненные игры. И никто больше. На машине каждого игрока хранилась только очень маленькая часть. Когда игрок хотел пройти немного дальше, он выкачивал самое последнее сохранение с сервера, играл немного, сохранялся и закачивал уже свое сохранение обратно на сервер, чтобы кто-нибудь другой смог им воспользоваться.
31 А что если игрок по какой-то причине захотел использовать более старую сохраненную игру? Возможно, текущая версия сохраненной игры безвыигрышна, потому что кто-то забыл взять некий игровой предмет на каком-то предыдущем уровне, и нужно найти последнюю сохраненную игру, которая все еще выигрышна. Или, может быть, хочется сравнить две более старые сохраненные игры, чтобы установить вклад каждого игрока.
33 Может быть много причин вернуться к более старой версии, но выход один: необходимо запросить центральный сервер о той старой сохраненной игре. Чем больше сохраненных игр требуется, тем больше понадобится связываться с сервером.
35 Новое поколение систем контроля версий, к которым относится Git, известны как распределенные системы, их можно понимать как обобщение централизованных систем. Когда игроки загружаются с главного сервера, они получают каждую сохраненную игру, а не только последнюю. Они как бы зеркалируют центральный сервер.
37 Эти первоначальные операции клонирования могут быть ресурсоёмкими, особенно если присутствует длинная история разработки, но это сполна окупается при длительной работе. Наиболее очевидная непосредственная выгода состоит в том, что если вам зачем-то потребуется более старая версия, дополнительное обращение к серверу не понадобится.
39 === Глупые предрассудки  ===
41 Широко распространенное заблуждение состоит в том, что распределенные системы непригодны для проектов, требующих официального централизованного хранилища. Ничто не может быть более далеким от истины. Получение фотоснимка не приводит к тому, что мы крадем чью-то душу. Точно так же клонирование главного хранилища не уменьшает его важность.
43 В первом приближении можно сказать, что все, что делает централизованная система контроля версий, хорошо сконструированная распределенная система может сделать лучше. Сетевые ресурсы просто дороже локальных. Хотя дальше мы увидим, что в распределенном подходе есть свои недостатки, менее вероятно провести ложные аналогии, руководствуясь этим приближенным правилом.
45 Небольшому проекту может понадобиться лишь часть функций, предлагаемых такой системой. Но использование плохо масштабируемой системы для маленьких проектов подобно использованию римских цифр в расчетах с небольшими числами. Более того, ваш проект может вырасти за пределы ваших первоначальных ожиданий. Использовать Git с самого начала — это как держать наготове швейцарский нож, даже если вы только открываете им бутылки. Однажды вам безумно понадобится отвертка и вы будете рады, что под рукой есть нечто большее, чем простая открывалка.
47 === Конфликты при слиянии  ===
49 Для этой темы аналогия с компьютерной игрой становится слишком натянутой. Вместо этого, давайте вернемся к редактированию документа.
51 Итак, допустим, что Алиса вставила строчку в начале файла, а Боб — в конец. Оба они закачивают свои изменения. Большинство систем автоматически сделает разумный вывод: принять и объединить их изменения так, чтобы обе правки — и Алисы, и Боба — были применены.
53 Теперь предположим, что и Алиса, и Боб независимо друг от друга сделали изменения в одной и той же строке. Тогда становится невозможным разрешить конфликт без человеческого вмешательства. Тот из них, кто вторым закачает на сервер изменения, будет информирован о _конфликте слияния_ (merge conflict), и должен либо выбрать, чье изменение перекроет другое, либо скорректировать всю строку.
55 Могут случаться и более сложные ситуации. Системы контроля версий разрешают простые ситуации сами и оставляют сложные для человека. Обычно такое их поведение поддается настройке.