Это первая статья из цикла публикаций о git. В этой серии постов мы делаем особый упор на логику работу с git, будет много логических схем, скриншотов и теории работы гита под капотом, например вы узнаете, как git интерпретирует директории и файлы, что такое указатели, коммиты, ветки.
Цель этой серии публикаций — дать практические навыки работы с git в терминале, что позволит вам всегда ориентироваться в версиях вашего проекта вне зависимости от окружения, которое вы используете для разработки. Поехали, сначала разберемся в том, что такое git и зачем он нужен.
Что такое Git?
Git — это распределенная система управления версиями, которая устанавливается на машину, где будет вестись работа над проектом. Грубо говоря, git — это софт, который можно скачать отсюда и установить на Linux, Windows или MacOS. В некоторых дистрибутивах Linux, git уже предустановлен, например, в Ubuntu 18/20/22.
Кстати, git был разработан Линусом Торвальдсом, чтобы решить проблему командной разработки ядра Linux. Основная проблема командной разработки больших проектов в том, что со временем становится очень сложно менеджерить процессы добавления нового кода в проект, так же как и тестировать его или отлавливать баги.
Git был изначально разработан с целью решить все эти проблемы. С течением времени он оброс новыми функциями, фишками и сейчас без него сложно представить разработку крупных проектов. Вот основные функции и возможности git:
- Управление различными версиями проекта;
- Создание и управление разными ветвями развития проекта;
- Откат к предыдущим версиям проекта;
- Быстрое клонирование проектов с удаленных git-серверов.
Надо сказать, что git — это не единственная система контроля версий. Есть еще Mercurial, Team Foundation Server, SVN и прочие решения, но все они сильно уступают в популярности git. В основном из-за того, что многие крупные IT-корпорации поддерживают и развивают git. Например, Microsoft, которой принадлежит gitHUB.
Если сейчас вам не совсем ясно что же такое git — не переживайте, в процессе прочтения статьи всё прояснится. Перейдем от слов к практике и пощупаем git вживую.
Работа с git: установка, настройка, создание репозитория
Как мы сказали ранее, git — это софт, который нужно установить на машину, где будет вестись разработка и настроить его. Прежде чем качать git — нужно проверить командой git --version текущую версию установленных пакетов, если ваша версия git сильно устарела, например наша версия git на Ubuntu 18 была 2.17+ (2.39 — актуальная версия), — ее следует обновить.
Установка и обновление git
Git можно установить на все популярные десктопные ОС: Windows, Linux, MacOS. В Ubuntu достаточно выполнить уже привычный многим набор команд: apt update && apt install -y git. Если git уже установлен, но версия устарела — обновить git можно так:
- Скачайте репозиторий с исходниками git: git clone https://github.com/git/git;
- Обновите apt-репозиторий: apt update;
- Скачайте набор пакетов, необходимых для сборки GIT из исходников:
- sudo apt-get install dh-autoreconf libcurl4-gnutls-dev libexpat1-dev \ gettext libz-dev libssl-dev;
- sudo apt-get install asciidoc xmlto docbook2x;
- sudo apt-get install install-info.
- Сделайте симлинк: sudo ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi.
- Перейдите в скачанный репозиторий командой cd и выполните следующий набор команд:
- make configure;
- ./configure --prefix=/usr;
- make all doc info;
- sudo make install install-doc install-html install-info.
Ещё раз выполните команду git --version, чтобы убедиться, что git успешно обновился. Теперь можно двигаться дальше и настроить git для работы.
Настройка git
В git есть множество сущностей, одна из которых — это коммит. Коммит сохраняет разность между предыдущим сохранением и новым сохранением. При сохранении коммита записываются мета-данные — информация о том, кто сделал коммит: имя автора и электронная почта. Эти данные очень важны в командной работе, они позволяют точно идентифицировать того, кто сделал коммит.
Настройка имени и электронной почты участника команды производится локально через консоль командами:
- git config --global user.name [имя пользователя];
- git config --global user.email [электронная почта пользователя].
Если имя пользователя задается с пробелом (Имя Фамилия) — тогда его необходимо указывать в двойных кавычках, электронная почта всегда задается без кавычек. При вводе электронной почты и имени пользователя git не возвращает никакого ответа, чтобы убедиться в правильности введенных данных можно выполнить команду: git config --list.
Помимо настройки имени пользователя и электронной почты в конфигурационном файле git можно указать множество других настроек, таких как: шаблон коммита, текстовый редактор коммита, настройка ветки по умолчанию и многое другое. Некоторые из этих параметров мы рассмотрим далее, а пока давайте переходить к главному — созданию репозитория.
Инициализация репозитория
Инициализация или создание репозитория производится командой git init в директории проекта, при этом директория как может содержать файлы проекта, так и может быть пустой. При вызове команды git init вы увидите следующее сообщение:
Тут следует обратить внимание на несколько важных вещей:
- По умолчанию git создаёт ветку master, где будут размещаться коммиты. В gitHUB же дефолтная ветка называется main — несоответствие веток может привести к проблемам в будущем, лучше сразу переименовать ветку master в main;
- Задать имя дефолтной ветки можно с помощью команды git config --global init.defaultBranch main, где main — название ветки. Эта команда работает до создания первого коммита;
- Переименовать уже существующую ветку можно командой git branch -m [название ветки].
При инициализации репозитория в директории проекта будет создана скрытая поддиректория .git, которая содержит различные сущности git и информацию о репозитории:
Тут мы сделаем небольшое, но очень важное отступление и расскажем, какие существуют области видимости в git или говоря простыми словами, какие стадии проходят файлы до того, как попадают в репозиторий — становятся частью поддиректории .git.
В git есть три зоны видимости файлов:
Первая зона видимости: рабочая директория (Working directory) — это директория, содержащая файлы проекта. Просмотреть все файлы в директории можно командой ls -la.
Вторая зона видимости: индекс (Staging area) — это виртуальная зона, где фиксируются изменения внесенные в файлы проекта перед тем, как они будут сохранены (закоммичены). Посмотреть, какие изменения содержатся в индексе можно командой git status.
Третья зона видимости: репозиторий (Repository) — это сохраненные изменения, попавшие в директорию .git после коммита. В этой зоне содержатся различные git-объекты. Напрямую с ними взаимодействовать нельзя.
Отметим, что просто инициализировать репозиторий в директории проекта недостаточно для того, чтобы изменения в файлах проекта начали индексироваться. Файлы для индексации нужно указывать вручную.
Добавление файлов в индекс
Добавить все файлы и подкаталоги проекта в индекс можно командой git add ., затем командой git status можно посмотреть, какие файлы и изменения подготовлены для коммита:
Git сам отслеживает внесенные вами изменения в файлы и директории, но подготовить их к коммиту надо вручную. Если вы после того как выполнили команду git add . внесли изменения в файлы, то они не будут учтены, команда git status отразит следующее:
На этом скрине красным выделены два действия с файлами, которые пока ещё не попали в индекс: 1) Внесение изменений в файл main.py; 2) Переименование файла modules.md в python_modules.md. Отметим, что старый файл modules.md помечен теперь, как удаленный, а вот новый файл python_modules.md вообще гитом не трекается — его нужно добавить в индекс командой git add python_modules.md.
Теперь, когда мы отправили все изменения в индекс — их можно сохранять в репозиторий. Перед переходом к следующему разделу, вкратце пройдемся по основным командам и действиям при установке, настройке и инициализации репозитория.
Кратко о GIT и его базовых настройках и командах
GIT — это система управления версиями, которая входит в многие популярные дистрибутивы Linux, например, Ubuntu 16+. Если в вашей сборке Linux нет гита из коробки, его всегда можно установить из apt (там будет не самая свежая версия) или скачать исходники с официального сайта git и скомпилировать их, как указано в нашей инструкции. Проверить версию git можно командой git --version, если git установлен корректно и версия отражается — можно переходить к созданию репозитория.
Репозиторий git — это скрытая директория .git в папке вашего проекта, где хранятся специальные git-объекты, описывающие состояние файлов и директорий вашего проекта во времени. Каждый раз, когда вы делаете коммит — вы сохраняете состояние файлов и директорий вашего проекта в git. Инициализируется или создается Git-репозиторий командой git init. После инициализации репозитория в него можно добавлять файлы для индексации.
В git есть три зоны видимости файлов:
- Рабочая директория проекта — это видимая зона, где отражаются файлы вашего проекта в текущем коммите, если вы удалили файл и сделали коммит, то в текущем времени его больше не будет, но если откатится на предыдущий коммит, то файл там будет, так как GIT сохраняет файлы целиком;
- Индекс или стейджинг — это невидимая зона, туда сохраняются подготовленные к коммиту изменения. Добавляются изменения в индекс командой git add .. Просмотреть изменения можно командой git status, а отправляются изменения в репозиторий командой git commit -m «комментарий»;
- Репозиторий — это скрытая директория .git, где в бинарном виде хранятся копии файлов и директорий. Они находятся в директории .git/objects/… Прочитать их простой командой типа cat не выйдет, для этого используется команда git cat-file -p [hash git-object].
Краткая логическая схема работы с git-репозиторием может выглядеть так:
Коммит — это одна из базовых сущностей git. Коммиты позволяют перемещаться по разным версиям проекта. Другая организационная единица git — это ветви. Ветви позволяют логически разделять направления разработки. О коммите и ветвях мы подробно поговорим в нашей следующей статье.
Ещё одной фишкой гита является возможность быстро скачивать уже существующие репозитории с gitHUB на сервер, работать над ними и загружать обратно, часто для такой работы требуются сторонние библиотеки и модули. Для такой работы удобнее всего использовать VPS с подключением по SSH, например, от 1cloud.