История развития систем контроля версий берет начало в далеком 1972 году, когда компания Bell Labs разработала первую систему управления версиями под названием Source Code Control System, или сокращенно SCCS. Программа была популярна вплоть до 1982 года, когда была разработана новая система под названием Revision Control System (RCS). Дальнейшее развитие систем контроля версий продолжилось в 2000 году, когда были выпущены сразу две программы: Subversion (более известная под именем SVN) и BitKeeper. Обе программы были выпущены с целью заменить морально устаревшие утилиты, такие как CVS и RCS. Однако настоящий прорыв произошел в 2005 году, когда появился Git, который снискал популярность среди разработчиков и IT-индустрии в целом. Сегодня Git стал инструментом, де-факто выступающим в качестве основного инструмента контроля версий, а также послужил основой для создания таких веб-сервисов, как GitHub, GitLab и Bitbucket.
В Git используется контентно-адресуемая система для хранения данных, основанная на адресации по контрольной сумме (она же хеш-сумма). Хеш-сумма выступает в роли уникального идентификатора содержимого пользовательских данных — иными словами, адресом каждого объекта является хеш его содержимого.
Git осуществляет хранение файлов, используя формат снимков. На практике это выглядит следующим образом: каждый раз, внося изменения, Git фиксирует каждое внесенное изменение в файл и сохраняет ссылку на ранее созданный снимок. Если в файлы не вносились изменения, Git не будет фиксировать их и вместо этого сохранит ссылку на предыдущую версию файла.
Git оперирует тремя типами объектов: файл, дерево и «коммит» (commit). В объект "файл" вносятся необходимые изменения; дерево — иерархия файлов в репозитории, которая создает связь между директориями и содержащимися в них файлами. Под «коммитом» понимают метод фиксации изменений в файлах.
В Git используются два типа репозиториев: локальный и удаленный. Локальный репозиторий хранится на устройстве пользователя. Удаленный репозиторий располагается на удаленном устройстве — например на отдельном компьютере. Большинство действий в Git выполняются локально, так как это не централизованная система.
Git является кроссплатформенным инструментом — поддерживается установка на операционные системы Windows, Linux, macOS. Несмотря на то, что Git традиционно используют в командной строке (что неудивительно, так как инструмент разрабатывался для использования в терминале устройства), существует большое количество разнообразных программ с графической оболочкой под все поддерживаемые операционные системы. Существуют как бесплатные, так и платные программы.
Для операционных систем Linux/Unix установить Git можно, используя официальные репозитории дистрибутива. Отдельно для Ubuntu создан официальный репозиторий от разработчиков, который предоставляет последнюю актуальную версию Git. Процесс инсталляции Git на различные дистрибутивы Linux описана в инструкции, доступной по ссылке.
Для пользователей Windows присутствуют разнообразные программы с графическим интерфейсом, включая такие, как GitHub Desktop, Sourcetree, GitKraken Desktop. С полным списком программ для Windows можно ознакомиться по ссылке.
Для пользователей macOS можно воспользоваться менеджером пакетов Homebrew или MacPorts, а также одной из десятков различных программ с графической оболочкой, включая такие, как GitUp, Gitfox, SnailGit, GitFinder и многие другие. Ознакомиться с инструкцией по установке Git на macOS можно по ссылке.
Отдельно стоит выделить, что в некоторых IDE, например, VS Code, Xcode, PyCharm, PhpStorm, WebStorm, Git уже предустановлен и его можно использовать “из-коробки”.
vds
В текущем разделе мы рассмотрим основы и использование основных функций системы Git, с которыми пользователи сталкиваются чаще всего.
Настроим базовые параметры Git, а именно зададим имя пользователя, а также адрес электронной почты. Данная информация будет отображена в каждом коммите для установления личности пользователя. Как правило, без настройки имени и адреса электронной почты нельзя взаимодействовать с Git и его функционалом. Зададим имя пользователя. выполнив в терминале команду (где Alex - это имя пользователя):
git config --global user.name "Alex"
Далее зададим адрес электронной почты, используя команду (где alex_mailbox@mail.com - это адрес электронной почты пользователя):
git config --global user.email alex_mailbox@mail.com
Если вы не хотите указывать свои настоящие данные, то можно задать любые данные, какие посчитаете нужными.
Как уже было упомянуто ранее, Git использует объект под названием репозиторий, представляющий собой виртуальное хранилище файлов. Со стороны пользователя репозиторий представляет собой директорию, наподобие той, что используется в операционных системах. В репозитории, помимо хранения файлов, также хранятся объекты Git — коммиты, ветки, история внесенных действий. В Git можно создать как новый репозиторий, так и создать репозиторий из уже существующей папки. Рассмотрим оба варианта на практике.
Создадим новую директорию:
mkdir stage-file-for-futher-projeect
Далее переходим в созданную директорию:
cd stage-file-for-futher-projeect
И выполним команду:
git init
При выполнении git init в пустой директории команда сообщит о том, что репозиторий был успешно создан, однако он не содержит в себе никаких файлов. При создании нового репозитория в его корне будет создана скрытая папка (папка, имя которой начинается с символа точки) с именем .git. Внутри папки .git расположены конфигурационные файлы Git и структура репозитория:
Также присутствует возможность скопировать уже существующий репозиторий. Такие репозитории называются удаленными. Обычно такую возможность используют при работе с такими веб-сервисами, как GitHub и GitLab. Чтобы скопировать удаленный репозиторий, необходимо знать его URL. Для скачивания используют команду git clone. В приведенном примере мы скачаем репозиторий с исходным кодом утилиты curl:
git clone https://github.com/curl/curl.git
После скачивания нам будет доступна папка с исходным кодом curl:
Одной из главных функциональных особенной Git является состояние (или статус) репозитория. Статус используется не только для проверки состояния репозитория, но и для того, чтобы узнать статус индексного раздела. Рассмотрим данную команду, используя репозиторий curl, скачанный ранее. При выполнение команды git status после того, как был скачан репозиторий, в ответ будет выведено сообщение:
Git сообщил, что в качестве основной ветки в репозитории используется ветка master, которая находится в одинаковом состоянии и синхронизирована с удаленной веткой master.
Теперь попробуем создать в текущем каталоге curl новый файл:
touch new-test-file.txt
После создания файла выведем статус репозитория:
git status
На скриншоте выше в репозитории появился новый статус, который сообщает о том, что были обнаружены неотслеживаемые изменения. Git сообщил нам об обнаружении нового файла, которого ранее не было в репозитории. Также было выведено сообщение, что Git не будет отслеживать данный файл, пока он не будет добавлен в индексную область Git. Индекс представляет собой область, в которую сохраняются все добавляемые файлы перед тем, как они будут добавлены в репозиторий. Чтобы добавить файл в индекс, воспользуемся командой:
git add new-test-file.txt
Статус репозитория был изменен. Проверим:
git status
Как можно увидеть, у репозитория появился новый статус, означающий добавление в индекс нового файла. Следующим шагом его можно “закоммитить”. Выполним коммит:
git commit -m "Added new-test-file.txt"
и убедимся что статус репозитория был также изменен:
git status
Git отобразил новый статус, который говорит нам о том, что наш локальный репозиторий находится впереди удаленного репозитория на одно внесенное изменение.
Чтобы Git начал отслеживать файлы, находящиеся в рабочем каталоге, их необходимо переместить в индексную область. Для этого используется команда git add. Например, вот так можно добавить один файл:
git add file1.txt
Если необходимо добавить все файлы сразу, используется символ точки:
git add .
git add поддерживает работу с символами регулярных выражений.
Например, чтобы добавить файлы с расширением .txt, необходимо использовать команду:
git add *.txt
Добавленные файлы можно убрать из индекса с помощью:
git reset file2.txt
Все внесенные изменения в репозиторий, включая добавление файлов, необходимо фиксировать. Это реализуется с помощью команды git commit. С ее помощью можно зафиксировать изменения, внесенные в репозиторий. Также коммиты можно использовать как инструмент для отката, чтобы вернуться на последний или нужный коммит. Выполнить коммит можно только тогда, когда добавлены все файлы.
Коммит снабжается сообщением (комментарием), в котором указывается, что за изменения были внесены. Выполним коммит, добавив к нему сообщение:
git commit -m "Added first file"
Git ведет историю коммитов. Для просмотра истории воспользуйтесь командой git log:
git log
Одна из самых мощных функций в Git - это ветвление. При помощи процедуры ветвления можно отделиться от основной версии проекта и начать работу в новом окружение, не затрагивая файлы основной ветки. Простыми словами, при помощи веток мы создаем копию файлов, присутствующих в репозитории, и изолируем их в новой ветке. Обратите внимание, что изменения, сделанные в одной ветке, не будут перенесены в другую ветку, пока вы сами не сделаете это вручную (про merge request мы поговорим в следующем разделе).
При помощи функционала веток можно протестировать новую версию проекта, не изменяя файлы в основной ветке.
Создадим новую ветку new_function:
git branch new_function
Выведем все доступные ветки:
git branch
git branch выводит только те ветки, которые доступны локально. Для вывода всех веток (локальных и удаленных) необходимо использовать:
git branch -a
Переключимся на ранее созданную ветку:
git checkout new_function
Создадим новый файл:
touch new-branch-file.txt
И добавим его:
git add new-branch-file.txt
Выполняем коммит:
git commit -m "Added new-branch-file.txt file"
Файл будет отображаться только в ветке new_function:
Убедимся, переключившись обратно на ветку main:
git checkout main
Как можно увидеть, ранее созданный файл new-branch-file.txt в ветке new_function недоступен в ветке main.
Ветки можно удалять. Для этого используется команда git branch -d. При удалении ветки необходимо учитывать, что нельзя удалить текущую ветку. При попытке удаления текущей ветки Git вернет ошибку:
git branch -d new_function
Чтобы удалить текущую ветку, необходимо переключиться на любую другую доступную ветку, например, на ветку main:
git checkout main
Далее ветку можно удалить:
git branch -d new_function
Если удаляемая ветка не была объединена, то при удаление такой ветки будет выведено предупреждение:
Чтобы удалить такую ветку, необходимо использовать опцию -D:
git branch -D new_function
Особенностью использования веток является изоляция внесенных изменений — изменения доступные в одной ветке автоматически не появляются в других. В Git существует процесс слияния двух веток, который называется merge request. При слиянии все изменения, которые были внесены в одну ветку, переносятся в другую. Рассмотрим на примере слияния изменений из ветки new_function в ветку main.
1) Создаем новую ветку:
git branch new_function
И переключаемся на нее:
git checkout new_function
2) Создаем новый файл:
touch new-branch-file.txt
3) Добавляем созданный файл в индекс:
git add new-branch-file.txt
4) Делаем коммит:
git commit -m "Added new-branch-file.txt file"
5) Переключаемся на ветку main:
git checkout main
6) Выполняем merge request:
git merge new_function
Теперь ранее внесенные изменения в ветке new_function появились в ветке main:
Ранее мы работали только с локальными репозиториями. Но Git поддерживает работу и с удаленными репозиториями. Удаленный репозиторий - это репозиторий, который хранится на сервере.
Локальный репозиторий можно подключить к удаленному репозиторию с помощью git remote add. Рассмотрим подключение на примере сервиса GitHub.
1) Открываем GitHub, авторизуемся в аккаунте и создаем новый репозиторий:
2) Возвращаемся на сервер, переходим в локальный репозиторий и подключаем его к удаленному:
git remote add origin https://github.com/AlexFromMoscow6/demo-repo.git
Отправим ранее добавленные изменения в удаленный репозиторий при помощи git push:
git push -u origin main
При использование команды git push система запросит логин и пароль от учетной записи того сервиса, на котором хранится репозиторий. Ранее GitHub использовал пароли для процесса аутентификации, однако теперь вместо паролей используются только токены. Также важным моментом является то, что при использование GitHub, вместо пароля от учетной записи необходимо ввести токен. Если у вас отсутствует токен, то его необходимо создать. Инструкция по созданию токена приведена по ссылке.
Переходим в GitHub и смотрим, чтобы файлы были опубликованы:
Чтобы поддерживать скачанный удаленный репозиторий в актуальном состоянии, используется команда git pull, которая соединятся с удаленным репозиторием и запрашивает изменения. Если изменения присутствуют, Git скачает их.
При использовании системы Git можно обойтись минимальным набором команд, чтобы инициализировать свой проект и отправить его в удаленный репозиторий. Рассмотрим данные действия на практическом примере. В качестве удаленной системы воспользуемся сервисом GitHub. В качестве приложения будет использовать небольшой проект на JavaScript.
1) Инициализируем репозиторий Git:
git init
2) Добавляем все файлы (символ точки), которые располагаются в репозитории:
git add .
3) Делаем коммит:
git commit -m "Initial commit"
4) Переходим в веб-версию GitHub, авторизуемся в своем аккаунте и создаем новый репозиторий (зеленая кнопка New):
Задаем имя репозиторию и выбираем тип репозитория (публичный, который будет доступен для всех пользователей, или приватный, доступ до которого будет только у владельца репозитория; доступ для остальных пользователей необходимо будет настраивать отдельно):
5) Возвращаемся в терминал и подключаем наш ранее созданный локальный репозиторий к удаленному:
git remote add origin https://github.com/AlexFromMoscow6/simple-js-app.git
6) Наконец, отправляем изменения в удаленный репозиторий:
git push -u origin main
Далее возвращаемся на страницу репозитория в GitHub и проверяем, что все файлы были добавлены в репозиторий:
Выгодные тарифы на VDS/VPS в Timeweb Cloud
Сегодня мы подробно познакомились с системой контроля версий Git. Git является мощным инструментом с большим функционалом, который одинаково хорошо работает как с небольшими, так и объемными проектами. При помощи Git можно легко отслеживать внесенные изменения, а также откатиться назад.