Модуль 1 · Что такое контроль версий

Справочник по Git и GitHub · модуль 1 · что такое контроль версий

Глава 1.1

1.1

Откуда
взялся Git

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

Категория
История и основные понятия
Уровень
Начальный
Связанные темы
Git и GitHub, устройство истории
Зачем это знать
Понимать, какую задачу решает Git и чем объясняется его устройство

§1Версии файла без Git

Без системы контроля версий прошлые варианты сохраняют копиями: перед каждой крупной правкой файл копируют под новым именем. Через две недели работы над курсовой папка выглядит так:

курсовая.docx курсовая_2.docx курсовая_испр.docx курсовая_испр_2.docx курсовая_финал.docx курсовая_финал_правки.docx курсовая_финал_точно_последняя.docx

По таким копиям нельзя быстро узнать, чем курсовая_испр_2 отличается от курсовая_испр, кто и когда добавил третью главу и в каком файле осталось введение до правки недельной давности. Чтобы это выяснить, файлы открывают рядом и сравнивают вручную.

Со вторым участником работы становится больше. Он тоже делает копии под своими именами и присылает файл курсовая_финал_Ивана.docx. Соединить его с файлом курсовая_финал_точно_последняя.docx можно только вручную, абзац за абзацем. Чем больше проект, тем больше такой работы: в ядре Linux миллионы строк кода и тысячи участников.

На полях: почему не помогают аккуратные имена

Имя файла не хранит сведений о том, какие строки изменились и зачем. Эти сведения записывает программа контроля версий.

§2Что делает система контроля версий

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

Дальше в каждой главе используются три термина. Каждый показан на репозитории этого справочника.

Репозиторийпапка проекта вместе с историей

Файлы проекта лежат в папке как обычно, их видно в списке. История хранится рядом, в скрытой папке .git. Когда репозиторий выложен на GitHub, тот же список файлов виден на странице проекта.

Страница репозитория справочника на GitHub: список файлов и папок, README ниже
Страница репозитория этой книги. В списке — те же index.html, styles.css и папка temy, что лежат на диске автора. Строка 8 Commits считает сохранённые состояния, 1 Branch — линии разработки.

Коммитодно сохранённое состояние проекта

В коммит входит содержимое файлов на этот момент, имя автора, дата и пояснение, что сделано. Открыв коммит, видно построчно: красным — что убрали, зелёным — что добавили.

Страница одного коммита на GitHub: пояснение, счётчик изменённых файлов и построчные изменения красным и зелёным
Коммит ea99758 этой книги. Сверху — пояснение автора, ниже 3 files changed и +61 −61: столько строк добавлено и убрано. Красная строка — как было, зелёная — как стало.

Историяцепочка коммитов от первого до последнего

Коммиты выстроены по времени, у каждого свой автор, дата и короткое имя из семи символов. По этому списку видно, как проект пришёл в сегодняшнее состояние и какой коммит что принёс.

Список коммитов репозитория на GitHub с датами и авторами
История справочника за один день: «Глава 1.2», «Глава 1.3», «Редактура текста». Справа — короткое имя коммита, по которому его можно открыть.

Ассоциация: сохранения в игре

В жизни

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

В Git

Коммит — то же сохранение: момент выбираете вы, пояснение пишете тоже вы. История — список сохранений, откат возвращает проект к выбранному состоянию.

Где не совпадаетИгра держит один слот и перезаписывает его. Git не стирает прошлые сохранения: каждое остаётся в истории, и к нему можно вернуться.

Зачем это нужно в работе

  • Сломалось после обновления. Сайт работал утром и перестал вечером. По истории видно, какие изменения были между этими моментами, и можно вернуть рабочее состояние одной операцией, пока разбираетесь с причиной.
  • Непонятная строка в чужом коде. Git показывает, в каком коммите она появилась, кто её написал и что человек тогда пояснил. По этим сведениям понятно, у кого спросить о причине.
  • Двое правят один проект. Правки не нужно сводить вручную: Git соединяет их сам и останавливается только там, где два человека изменили одну строку.
  • Проверка чужой работы. Руководитель смотрит изменения последнего коммита: что убрали и что добавили. Такая проверка называется ревью.

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

Что меняется на практике:

Копии папокЧтобы понять разницу, открываем два файла рядом и сравниваем глазами.
→
Контроль версийПрограмма сама показывает изменённые строки: слева было, справа стало.
Копии папокАвтор правки известен, только если он подписал имя файла.
→
Контроль версийУ каждого коммита есть автор, время и пояснение — это часть записи.
Копии папокВернуться к состоянию двухнедельной давности можно, если такая копия была сделана.
→
Контроль версийЛюбое сохранённое состояние доступно всегда, отдельно по каждому файлу.
Копии папокПравки двух человек объединяют вручную.
→
Контроль версийПрограмма объединяет их сама и останавливается, только если оба изменили одну строку.

Git — одна из таких систем, до него были другие. Они разобраны в следующем параграфе.

§3Как это решали до Git

Программы пишут коллективно с 1960-х годов, и первые системы контроля версий появились задолго до Git.

1972SCCS
Первая система контроля версий

Марк Рокайнд пишет в Bell Labs систему SCCS для мейнфреймов IBM. Она хранит версии одного файла и показывает разницу между ними.

1982RCS
Версии для каждого файла

Вальтер Тихи выпускает RCS. Работает с отдельным файлом, история хранится рядом с ним. Проект целиком по-прежнему не отслеживается: есть версии файлов, а версии проекта нет.

1990CVS
Общий сервер для команды

CVS складывает историю на один сервер, куда ходят все разработчики. С CVS над проектом одновременно работают несколько человек. Отсюда пошла централизованная модель.

2000Subversion
Subversion вместо CVS

Subversion (SVN) исправляет недостатки CVS: переименование файлов, работу с каталогами, атомарные фиксации. Модель остаётся прежней — один центральный сервер, на котором лежит вся история.

2005Git
История у каждого на диске

Линус Торвальдс делает систему, в которой полная копия истории есть на каждом компьютере, а центральный сервер не обязателен.

Централизованно или распределённо

Git отличается от CVS и SVN местом, где хранится история проекта. Ниже две схемы.

Как было: один сервер в центре

сервер Аня Борис Вика

История целиком лежит на сервере. На компьютере разработчика — только текущее состояние файлов.

  • Когда сервер недоступен, нельзя сохранить версию и посмотреть прошлую.
  • Каждое действие идёт по сети, поэтому история листается медленно.
  • Если сервер потерян вместе с диском, потеряна вся история проекта.

Как стало: копия истории у каждого

Анявся история Борисвся история Викався история GitHubвся история

У каждого участника полная история проекта на своём диске. Между собой они обмениваются изменениями.

  • Без интернета работа продолжается: коммиты делаются локально.
  • История открывается без обращения к сети: она лежит на вашем диске.
  • Если сервер вышел из строя, проект восстанавливают из копии любого участника.

Ассоциация: один конспект на группу или у каждого свой

В жизни

Вариант первый: конспект один, лежит у старосты. За каждой записью идут к старосте. Если староста заболел, группа остаётся без конспекта.

Вариант второй: конспект переписан каждым. Любой может заниматься сам, а новые записи участники передают друг другу.

В Git

Первый вариант — CVS и Subversion: история на сервере, без него работа стоит.

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

Где не совпадаетПереписанные от руки конспекты расходятся: у каждого свои сокращения. Копии репозитория сходятся точно — одинаковое содержимое даёт одинаковые имена коммитов, и Git видит, где копии разошлись, а где совпадают.

В распределённой модели GitHub — ещё одна копия репозитория, с которой участники договорились сверяться. Особого положения у неё нет: Git одинаково работает с любой копией.

§4Ядро Linux и BitKeeper

К началу 2000-х над ядром Linux работали тысячи человек по всему миру. Ни CVS, ни Subversion такой нагрузки не выдерживали: история огромная, правки идут потоком, а ветки в централизованной модели дороги. До 2002 года Линус Торвальдс принимал изменения почтой — люди присылали заплатки текстом, и он накладывал их вручную. Со временем заплаток стало больше, чем один человек успевал разобрать.

В 2002 году ядро перешло на BitKeeper — распределённую систему Ларри Маквоя. В ней было то, чего не хватало: у каждого своя копия истории, ветки дешёвые, слияния автоматические. BitKeeper — закрытая коммерческая программа. Разработчикам ядра её отдали бесплатно, но с условием не участвовать в создании конкурирующих систем.

Ларри Маквой, автор BitKeeper
BitKeeper

Ларри Маквой

Основатель компании BitMover и автор BitKeeper — распределённой системы, в которой ядро Linux разрабатывалось с 2002 по 2005 год. После его решения отозвать бесплатную лицензию началась разработка Git.

Фото: Eugene Zelenko, CC BY-SA 4.0 · Wikimedia Commons
Линус Торвальдс на конференции LinuxCon Europe
Автор Git

Линус Торвальдс

Создатель ядра Linux. Писал Git как инструмент для собственной работы: ему нужно было принимать заплатки в ядро.

Фото: Krd, CC BY-SA 4.0 · Wikimedia Commons

Сообщество свободного программного обеспечения три года спорило, допустимо ли разрабатывать свободное ядро в закрытом инструменте. Спор закончился в апреле 2005 года. Эндрю Триджелл, известный по проекту Samba, разобрался в сетевом протоколе BitKeeper и написал программу, которая выгружала историю без фирменного клиента. Маквой счёл это нарушением условий и отозвал бесплатную лицензию для разработчиков ядра.

Ядро Linux осталось без системы контроля версий. Подходящей по скорости и по модели работы замены не существовало.

§5Апрель 2005 года: первые версии Git

Торвальдс написал свою систему. Ниже ход работы по датам.

3 апреля2005
Первая строка кода

Торвальдс начинает писать систему с нуля. Задача: принимать заплатки в ядро быстрее, чем это делает BitKeeper.

6 апреля2005
Объявление в рассылке ядра

В списке рассылки LKML появляется письмо о новом инструменте. Постоянного названия и документации у него ещё нет.

7 апреля2005
Git хранит сам себя

Через четыре дня после начала работы Git уже пригоден для того, чтобы вести в нём собственную разработку. С этого дня история Git лежит в самом Git.

18 апреля2005
Первое слияние веток

Две линии разработки впервые объединены автоматически.

16 июня2005
Ядро 2.6.12 выпущено через Git

Первый выпуск ядра Linux, собранный и опубликованный уже с помощью Git.

26 июля2005
У Git новый сопровождающий

Торвальдс передаёт развитие Git Джунио Хамано и возвращается к ядру. Сам он продолжает пользоваться Git в работе над ядром.

21 декабря2005
Версия 1.0

Версия 1.0 вышла меньше чем через девять месяцев после начала работы.

Git писался под конкретные условия: огромный проект, тысячи участников, отсутствие доверия между ними и отсутствие центрального сервера. Этими условиями объясняется устройство Git.

§6Откуда название Git

Название расшифровки не имеет. В британском английском git — это ругательство в адрес неприятного человека, примерно «болван». Торвальдс объяснял выбор так:

«Я эгоистичный мерзавец и называю все свои проекты в честь себя. Сначала „Linux“, теперь „git“.»

Линус Торвальдс · о происхождении названия

В самом первом коммите Git автор описал проект как «the stupid content tracker» — «тупой отслеживатель содержимого» — и перечислил, что может означать название, «в зависимости от настроения»: от «случайного сочетания трёх букв» до «глобального информационного трекера», когда всё работает. В основе Git лежит простой механизм хранения, привычные команды надстроены над ним.

На полях: как произносить

По-русски прижилось «гит», с ударением на единственный слог. Вариант «джит» неверен: слово читается так, как пишется.

§7Четыре требования Торвальдса

Инструмент писался под ядро Linux, поэтому требования к нему были известны заранее. Они объясняют устройство Git.

1. Скорость история — на вашем диске без запросов по сети

Просмотр истории и переключение веток занимают доли секунды.

2. Распределённость полная копия у каждого сервер — по договорённости

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

3. Дешёвые ветки ветка = указатель на коммит

Ветку заводят под каждую правку, даже мелкую. В SVN создание ветки занимало время, в Git это одна операция.

4. Целостность каждый коммит подписан хешем e83c516…

Подменить старый коммит незаметно нельзя: изменение содержимого меняет хеш, а вместе с ним и хеши всех следующих коммитов.

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

§8Кто развивает Git

Торвальдс вёл Git только первые месяцы. В июле 2005 года он передал сопровождение Джунио Хамано, который участвовал в разработке с первых недель и с тех пор отвечает за выпуск версий.

Джунио Хамано, сопровождающий Git
Сопровождающий

Джунио Хамано

Ведёт Git с июля 2005 года: принимает изменения от сообщества, собирает выпуски, отвечает за совместимость. Все выпуски начиная с версии 1.0 собраны им.

Фото: Junio Hamano, CC BY-SA 3.0 · Wikimedia Commons
Tux — пингвин, талисман Linux
Проект-заказчик

Ядро Linux

Первый пользователь Git. Требования ядра — скорость, ветки и проверка целостности — определили устройство Git.

Tux: Larry Ewing, Simon Budig, Garrett LeSage · Wikimedia Commons

Git распространяется под лицензией GPL версии 2: его можно использовать, читать исходный код и изменять. Отозвать право пользоваться Git не может никто, включая автора, поэтому ситуация с BitKeeper не повторится.

§9Git сегодня

Сейчас Git используют далеко за пределами ядра Linux. По опросам разработчиков, им пользуются свыше девяти из десяти. Открытый код крупных проектов хранится в Git-репозиториях:

LinuxЯдро Linux
AndroidAndroid
GoogleGoogle
MicrosoftMicrosoft
NetflixNetflix
NASANASA
ЯндексЯндекс
Visual Studio CodeVS Code

Логотипы: Tux — Larry Ewing и другие; Android — Google, CC BY 3.0; Google, Microsoft, Netflix, NASA, Яндекс, VS Code — общественное достояние. Все файлы взяты с Wikimedia Commons и принадлежат своим правообладателям.

Для Git появились сервисы, где репозитории хранят и обсуждают. Их несколько, и Git работает с любым:

GitHubGitHub · 2008
GitLabGitLab · 2011
BitbucketBitbucket · 2008
Apache SubversionSVN · используется

Логотипы: GitHub — MIT; GitLab — MIT; Bitbucket — Atlassian, общественное достояние; Subversion — RRZEicons, CC BY-SA 3.0. Источник — Wikimedia Commons.

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

Дальше в книге используется GitHub: на нём размещено больше всего открытых проектов, и он поддерживается Visual Studio Code без дополнительных настроек.

§10Частые заблуждения

Обычно думаютGit и GitHub — это одно и то же.
На самом делеGit — программа на вашем компьютере, GitHub — сайт, где хранят копию репозитория. Git работает без интернета и без какого-либо сайта.
Обычно думаютGit нужен только командам.
На самом делеОдному человеку он нужен для того же: вернуться к рабочему варианту, посмотреть, что изменилось со вчерашнего дня, и не хранить семь копий папки.
Обычно думаютGit — это резервное копирование.
На самом делеРезервная копия сохраняет файлы по расписанию. Git сохраняет состояния, которые вы отметили сами, и хранит пояснение к каждому.
Обычно думаютБез командной строки с Git не работают.
На самом делеВся работа в книге идёт через панель Source Control в VS Code. Команды Git показаны рядом с кнопками, набирать их не требуется.

§11Проверьте себя

Какую задачу решает система контроля версий, с которой не справляются копии папок?

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

Чем распределённая модель отличается от централизованной?

Местом, где лежит история. В централизованной (CVS, SVN) она одна и находится на сервере, без связи с ним работать нельзя. В распределённой (Git) полная копия истории есть у каждого участника, поэтому коммиты делаются локально, история открывается без сети, а сервер нужен только чтобы обмениваться изменениями.

Почему появился Git: что произошло в апреле 2005 года?

Ядро Linux с 2002 года разрабатывалось в закрытой системе BitKeeper, отданной сообществу бесплатно. После того как Эндрю Триджелл разобрал её сетевой протокол, компания отозвала бесплатную лицензию. Подходящей замены не существовало, и Торвальдс написал свою систему: 3 апреля — первый код, 7 апреля Git уже вёл собственную разработку.

Кто развивает Git сейчас?

Джунио Хамано. Торвальдс написал первую версию и в июле 2005 года передал ему сопровождение. Хамано ведёт проект до сих пор.

Почему в Git ветку создают быстрее, чем в SVN?

В Git ветка — это указатель на коммит, а вся история лежит у вас на диске: создание ветки не копирует файлы и не требует сети. В централизованной модели ветка создавалась на сервере и стоила времени, поэтому её заводили редко и под крупные задачи.

Объясните своими словами, почему Git можно пользоваться без интернета, а SVN — нельзя.

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

§12Шпаргалка по главе

Что это такое Git — система контроля версий хранит историю проекта
Три слова репозиторий — проект с историей коммит — сохранённое состояние история — цепочка коммитов
Ключевые даты 2002 — ядро на BitKeeper апрель 2005 — Git написан июль 2005 — Хамано ведёт проект
Отличие от SVN SVN: история на сервере Git: история у каждого

Итог главы

Git появился потому, что ядру Linux срочно понадобилась замена BitKeeper, а готовой замены не было. Отсюда его устройство: полная копия истории у каждого участника, локальные операции без обращения к серверу, дешёвые ветки и хеш, по которому видна любая подмена. Понятия репозитория, коммита и истории дальше используются постоянно. Следующая глава — о разнице между Git и GitHub.

Откуда взяты факты
  1. Письмо Линуса Торвальдса в рассылке ядра Linux о первой версии Git, 6 апреля 2005 года — lore.kernel.org.
  2. Первый коммит Git и его файл README — github.com/git/git.
  3. История Git, переход ядра на BitKeeper и отзыв лицензии — статья «Git» в Википедии и раздел «A Short History of Git» в книге Pro Git.
  4. Доля Git среди систем контроля версий — ежегодный опрос разработчиков Stack Overflow Developer Survey.
  5. Все изображения — Wikimedia Commons, лицензии указаны под каждым.
Глава 1.1 · Откуда взялся Git · Справочник по Git и GitHub Автор: Макаров Максим Николаевич