<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Бесплатная миграция IT-инфраструктуры в облако

Контроль версий Git

Александр Бархатов
Александр Бархатов
Технический писатель
03 сентября 2024 г.
251
12 минут чтения
Средний рейтинг статьи: 5

История развития систем контроля версий берет начало в далеком 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 не будет фиксировать их и вместо этого сохранит ссылку на предыдущую версию файла.

Git оперирует тремя типами объектов: файл, дерево и «коммит» (commit). В объект "файл" вносятся необходимые изменения; дерево — иерархия файлов в репозитории, которая создает связь между директориями и содержащимися в них файлами. Под «коммитом» понимают метод фиксации изменений в файлах.

В Git используются два типа репозиториев: локальный и удаленный. Локальный репозиторий хранится на устройстве пользователя. Удаленный репозиторий располагается на удаленном устройстве — например на отдельном компьютере. Большинство действий в 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, а именно зададим имя пользователя, а также адрес электронной почты. Данная информация будет отображена в каждом коммите для установления личности пользователя. Как правило, без настройки имени и адреса электронной почты нельзя взаимодействовать с Git и его функционалом. Зададим имя пользователя. выполнив в терминале команду (где Alex - это имя пользователя):

git config --global user.name "Alex"

Далее зададим адрес электронной почты, используя команду (где alex_mailbox@mail.com - это адрес электронной почты пользователя):

git config --global user.email alex_mailbox@mail.com

Если вы не хотите указывать свои настоящие данные, то можно задать любые данные, какие посчитаете нужными.

Создание репозитория Git

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

Создадим новую директорию:

mkdir stage-file-for-futher-projeect

Далее переходим в созданную директорию:

cd  stage-file-for-futher-projeect

И выполним команду:

git init

1

При выполнении git init в пустой директории команда сообщит о том, что репозиторий был успешно создан, однако он не содержит в себе никаких файлов. При создании нового репозитория в его корне будет создана скрытая папка (папка, имя которой начинается с символа точки) с именем .git. Внутри папки .git расположены конфигурационные файлы Git и структура репозитория:

2

Копирование Git-репозитория

Также присутствует возможность скопировать уже существующий репозиторий. Такие репозитории называются удаленными. Обычно такую возможность используют при работе с такими веб-сервисами, как GitHub и GitLab. Чтобы скопировать удаленный репозиторий, необходимо знать его URL. Для скачивания используют команду git clone. В приведенном примере мы скачаем репозиторий с исходным кодом утилиты curl:

git clone https://github.com/curl/curl.git

3

После скачивания нам будет доступна папка с исходным кодом curl:

4

Состояние репозитория Git

Одной из главных функциональных особенной Git является состояние (или статус) репозитория. Статус используется не только для проверки состояния репозитория, но и для того, чтобы узнать статус индексного раздела. Рассмотрим данную команду, используя репозиторий curl, скачанный ранее. При выполнение команды git status после того, как был скачан репозиторий, в ответ будет выведено сообщение:

5

Git сообщил, что в качестве основной ветки в репозитории используется ветка master, которая находится в одинаковом состоянии и синхронизирована с удаленной веткой master.

Теперь попробуем создать в текущем каталоге curl новый файл:

touch new-test-file.txt

После создания файла выведем статус репозитория:

git status

6

На скриншоте выше в репозитории появился новый статус, который сообщает о том, что были обнаружены неотслеживаемые изменения. Git сообщил нам об обнаружении нового файла, которого ранее не было в репозитории. Также было выведено сообщение, что Git не будет отслеживать данный файл, пока он не будет добавлен в индексную область Git. Индекс представляет собой область, в которую сохраняются все добавляемые файлы перед тем, как они будут добавлены в репозиторий. Чтобы добавить файл в индекс, воспользуемся командой:

git add new-test-file.txt

Статус репозитория был изменен. Проверим:

git status

7

Как можно увидеть, у репозитория появился новый статус, означающий добавление в индекс нового файла. Следующим шагом его можно “закоммитить”. Выполним коммит:

git commit -m "Added new-test-file.txt"

8

и убедимся что статус репозитория был также изменен:

git status

9

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"

10

История коммитов

Git ведет историю коммитов. Для просмотра истории воспользуйтесь командой git log:

git log

11

Работа с ветками

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

При помощи функционала веток можно протестировать новую версию проекта, не изменяя файлы в основной ветке. 

Создадим новую ветку new_function:

git branch new_function

 Выведем все доступные ветки:

git branch

12

git branch выводит только те ветки, которые доступны локально. Для вывода всех веток (локальных и удаленных) необходимо использовать:

git branch -a

 Переключимся на ранее созданную ветку:

git checkout new_function

13

Создадим новый файл:

touch new-branch-file.txt

И добавим его:

git add new-branch-file.txt

Выполняем коммит:

git commit -m "Added new-branch-file.txt file"

Файл будет отображаться только в ветке new_function:

14

Убедимся, переключившись обратно на ветку main:

git checkout main

15

Как можно увидеть, ранее созданный файл new-branch-file.txt в ветке new_function недоступен в ветке main.

Удаление веток

Ветки можно удалять. Для этого используется команда git branch -d. При удалении ветки необходимо учитывать, что нельзя удалить текущую ветку. При попытке удаления текущей ветки Git вернет ошибку:

git branch -d new_function

16

Чтобы удалить текущую ветку, необходимо переключиться на любую другую доступную ветку, например, на ветку main:

git checkout main

17

Далее ветку можно удалить:

git branch -d new_function

Image18

Если удаляемая ветка не была объединена, то при удаление такой ветки будет выведено предупреждение:

18

Чтобы удалить такую ветку, необходимо использовать опцию -D:

git branch -D new_function

19

Слияние веток

Особенностью использования веток является изоляция внесенных изменений — изменения доступные в одной ветке автоматически не появляются в других. В 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

20

Теперь ранее внесенные изменения в ветке new_function появились в ветке main:

21

Работа с удаленными репозиториями Git

Ранее мы работали только с локальными репозиториями. Но Git поддерживает работу и с удаленными репозиториями. Удаленный репозиторий - это репозиторий, который хранится на сервере. 

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

Локальный репозиторий можно подключить к удаленному репозиторию с помощью git remote add. Рассмотрим подключение на примере сервиса GitHub.

1) Открываем GitHub, авторизуемся в аккаунте и создаем новый репозиторий:

22

2) Возвращаемся на сервер, переходим в локальный репозиторий и подключаем его к удаленному:

git remote add origin https://github.com/AlexFromMoscow6/demo-repo.git

Отправка изменений в удаленный репозиторий

Отправим ранее добавленные изменения в удаленный репозиторий при помощи git push: 

git push -u origin main

23

При использование команды git push система запросит логин и пароль от учетной записи того сервиса, на котором хранится репозиторий. Ранее GitHub использовал пароли для процесса аутентификации, однако теперь вместо паролей используются только токены. Также важным моментом является то, что при использование GitHub, вместо пароля от учетной записи необходимо ввести токен. Если у вас отсутствует токен, то его необходимо создать. Инструкция по созданию токена приведена по ссылке.

Переходим в GitHub и смотрим, чтобы файлы были опубликованы:

24

Получение изменений из удаленного репозитория

Чтобы поддерживать скачанный удаленный репозиторий в актуальном состоянии, используется команда git pull, которая соединятся с удаленным репозиторием и запрашивает изменения. Если изменения присутствуют, Git скачает их.

Минимальный набор команд git для начала работы с проектом

При использовании системы Git можно обойтись минимальным набором команд, чтобы инициализировать свой проект и отправить его в удаленный репозиторий. Рассмотрим данные действия на практическом примере. В качестве удаленной системы воспользуемся сервисом GitHub. В качестве приложения будет использовать небольшой проект на JavaScript.

1) Инициализируем репозиторий Git:

git init

25

2) Добавляем все файлы (символ точки), которые располагаются в репозитории:

git add .

26

3) Делаем коммит:

git commit -m "Initial commit"

27

4) Переходим в веб-версию GitHub, авторизуемся в своем аккаунте и создаем новый репозиторий (зеленая кнопка New):

28

Задаем имя репозиторию и выбираем тип репозитория (публичный, который будет доступен для всех пользователей, или приватный, доступ до которого будет только у владельца репозитория; доступ для остальных пользователей необходимо будет настраивать отдельно):

29

5) Возвращаемся в терминал и подключаем наш ранее созданный локальный репозиторий к удаленному: 

git remote add origin https://github.com/AlexFromMoscow6/simple-js-app.git

6) Наконец, отправляем изменения в удаленный репозиторий:

git push -u origin main

30

Далее возвращаемся на страницу репозитория в GitHub и проверяем, что все файлы были добавлены в репозиторий:

31

Выгодные тарифы на VDS/VPS в Timeweb Cloud

Сегодня мы подробно познакомились с системой контроля версий Git. Git является мощным инструментом с большим функционалом, который одинаково хорошо работает как с небольшими, так и объемными проектами. При помощи Git можно легко отслеживать внесенные изменения, а также откатиться назад.

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
03 сентября 2024 г.
251
12 минут чтения
Средний рейтинг статьи: 5
Пока нет комментариев