Что такое Git
Определение и важность Git, производительность, безопасность и гибкость Git как системы контроля версий.
В этой главе объясняется, что такое Git, почему он стал стандартом для отслеживания исходного кода и как его архитектурные решения — распределённая история, хранение данных с адресацией по содержимому и дешёвое ветвление — превращаются в ежедневные преимущества для разработчиков и команд. К концу главы вы поймёте, где применяется Git, познакомитесь с несколькими командами для начала работы и узнаете, какие смежные главы стоит прочитать далее.
Определение
Git — это система контроля версий (VCS), которая записывает изменения набора файлов с течением времени, чтобы можно было вернуться к любой более ранней версии, увидеть, кто и что изменил, и работать над одним проектом параллельно, не перезаписывая результаты работы друг друга. Это наиболее широко используемая VCS в разработке программного обеспечения.
Git был создан в 2005 году Линусом Торвальдсом, автором ядра Linux, для управления исходным кодом самого Linux после того, как проект лишился доступа к предыдущему инструменту. Сегодня Git используется в проектах любого масштаба — от отдельного скрипта до самого ядра Linux.
Ключевая особенность Git состоит в том, что он распределённый. Вместо хранения истории проекта на одном центральном сервере каждый разработчик клонирует полную копию репозитория — вместе со всей историей — на свой компьютер. Можно делать коммиты, создавать ветки, просматривать историю и искать по логу полностью в офлайн-режиме; сеть нужна только для обмена работой с другими.
Распределённые и централизованные системы. В централизованной VCS (например, Subversion) есть один авторитетный сервер, и для создания коммита требуется сетевое соединение. В распределённой VCS, такой как Git, каждый клон является полной резервной копией, большинство операций выполняются локально и поэтому быстро, а единой точки отказа не существует.
Важность Git
Git — это быстрая, эффективная распределённая VCS, которая справляется с проектами любого размера, от небольших скриптов до очень больших кодовых баз. Несколько причин, по которым он важен в повседневной работе:
- Дешёвое локальное ветвление. Создание ветки происходит почти мгновенно, потому что Git записывает лишь небольшой указатель, поэтому эксперименты в изолированной среде — норма, а не исключение. Смотрите git branch.
- Удобная область индексирования. Git позволяет точно выбрать, какие изменения войдут в следующий коммит, до его записи, что позволяет делать коммиты сфокусированными. Смотрите git add.
- Поддержка различных рабочих процессов. Один и тот же инструмент подходит как одному разработчику, так и команде из 100 человек. Смотрите Git workflows.
- Бесплатный и открытый исходный код. Нет затрат на лицензию, а исходный код открыт для изучения и участия.
- Нелинейная разработка. Многие направления работы могут вестись параллельно и впоследствии объединяться, что позволяет разработчикам и командам работать независимо, не мешая друг другу.

Производительность Git
Git создан для скорости, и большая часть этой скорости обусловлена тем, что операции выполняются над локальным репозиторием, а не удалённым сервером. Ветвление, слияние, создание коммитов и сравнение прошлых версий — всё это оптимизировано так, чтобы ощущаться мгновенным даже на больших историях.
Ключевым архитектурным решением является то, что Git отслеживает содержимое, а не файлы. При создании коммита Git сохраняет снимок содержимого каждого файла; если файл не изменился между коммитами, Git хранит указатель на идентичное содержимое, которое уже есть, а не новую копию. Поскольку хранение организовано по содержимому, Git может определить, был ли файл просто переименован, разбит или реорганизован. На диске объекты репозитория используют сочетание дельта-кодирования (хранение различий между похожими объектами) и сжатия zlib, что делает даже длинные истории компактными.
Безопасность Git
Главный приоритет Git — целостность управляемого исходного кода. Каждый объект в репозитории — содержимое файлов, каталоги, коммиты и теги — идентифицируется криптографическим хешем своего содержимого. Поскольку хеш каждого коммита также включает хеш его родителя, вся история выстраивается в цепочку: изменение любого прошлого содержимого изменит все последующие хеши, делая тайную подмену обнаруживаемой.
Git исторически использовал SHA-1 для этих хешей и переходит на SHA-256 для усиления этой гарантии. Помимо целостности, можно также подтвердить авторство коммита, подписав коммиты и теги ключом GPG или SSH, чтобы рецензенты могли убедиться, что изменение пришло от доверенного автора.
Гибкость Git
Одним из преимуществ Git является его гибкость в нескольких аспектах:
- Отслеживание изменений — каждый коммит содержит автора, временну́ю метку и сообщение, поэтому у вас всегда есть читаемая запись о том, что и почему изменилось.
- Резервное копирование и восстановление — поскольку каждый клон содержит полную историю, компьютер каждого разработчика фактически является резервной копией, и любое прошлое состояние можно восстановить.
- Совместная работа — команды могут одновременно работать над одним проектом и объединять свою работу с помощью слияния.
- Ветвление и слияние — работа ведётся в ветке, и после проверки и одобрения она сливается обратно в основную ветку. История показывает, кто изменил каждый файл и какие именно строки отличаются.
- Развёртывание — Git не выполняет развёртывание кода самостоятельно, но отслеживает точные версии и легко интегрируется с конвейерами CI/CD, которые собирают и выгружают эти версии.

Контроль версий с помощью Git
В наши дни Git является наиболее предпочтительной системой контроля версий, поскольку в ней есть почти всё необходимое разработчикам для достижения более эффективных результатов. Основные причины перечислены ниже:
- Git настолько популярен, что большинство разработчиков умеют работать с ним ещё до окончания колледжа или университета. Кроме того, Git считается основой систем контроля версий: разработчики, уже освоившие его, могут легко овладеть и другими системами.
- Благодаря своей распространённости Git интегрирован во многие крупные программные инструменты и сервисы.
- Существует множество книг, учебных пособий и даже специализированных сайтов, помогающих разработчикам изучить Git.
- Поскольку Git является программным обеспечением с открытым исходным кодом, разработчики могут использовать его бесплатно.
Основная критика в адрес Git связана со сложностью его изучения. В частности, некоторые термины, используемые в Git, могут иметь иные определения, чем в других VCS. Тем не менее это того стоит, поскольку умение работать с Git является отличным преимуществом для команд и разработчиков-одиночек и одним из ключей к их будущему успеху.
Наиболее популярные Git-решения
Несколько сторонних платформ управляют репозиториями Git и широко используются для быстрой и эффективной разработки программного обеспечения. Наиболее популярными хостинговыми сервисами на основе Git являются GitHub, Bitbucket и GitLab.
GitHub — это хостинг репозиториев на основе Git, первоначально запущенный в 2008 году Томом Престоном-Вернером, Крисом Ванстратом и PJ Хайэттом. Это крупнейшая платформа для хостинга репозиториев с более чем 38 миллионами проектов. Она позволяет размещать и проверять код, управлять проектами и разрабатывать программное обеспечение.
Bitbucket был запущен в 2008 году австралийским стартапом и изначально поддерживал только проекты Mercurial. В 2010 году Bitbucket был приобретён Atlassian, и с 2011 года начал поддерживать хостинг Git, который теперь является его основным направлением. Он предоставляет неограниченное количество бесплатных приватных репозиториев, интеграцию с Jira и Trello, а также встроенную непрерывную доставку.
GitLab был основан Дмитрием Запорожцем и Валерием Сизовым в 2011 году с целью предоставить альтернативу существующим решениям для управления репозиториями. Компания была зарегистрирована лишь в 2014 году. Она предоставляет непрерывную интеграцию и доставку, agile-разработку, Auto DevOps и многое другое.
Основные команды Git
После установки Git несколько основных команд охватывают повседневный рабочий процесс:
git init— создаёт новый репозиторий Git в текущем каталоге.git clone <url>— загружает существующий репозиторий с полной историей с удалённого сервера.git add <file>— добавляет изменения в индекс, чтобы они вошли в следующий коммит.git commit -m "message"— записывает проиндексированные изменения как новый снимок с описательным сообщением.git status— показывает, какие файлы изменены, проиндексированы или не отслеживаются.git push— отправляет локальные коммиты в удалённый репозиторий.
Первый репозиторий от начала до конца
Последовательность ниже создаёт новый проект, записывает первый коммит и проверяет результат. Выполните эти команды в пустой папке, чтобы следовать примеру:
# 1. Start tracking the current folder
git init
# 2. Create a file and stage it for the next commit
echo "# My Project" > README.md
git add README.md
# 3. Record the snapshot
git commit -m "Add project README"
# 4. See the history you just created
git log --onelineВывод git log --oneline — одна строка на коммит: короткий хеш, за которым следует сообщение:
a1b2c3d (HEAD -> main) Add project READMEДалее можно добавить удалённый репозиторий и выполнить git push, чтобы поделиться работой, или создать ветку для реализации новой функции. Глава git log подробнее рассматривает чтение истории.