Введение в Git/GitHub: установка и настройка (ч. 7)

Введение
В предыдущей статье мы рассмотрели наиболее часто используемые команды при работе в командной строке. В данной публикации продолжим осваивать этот инструмент, используя его для взаимодействия с системой контроля версий (Version Control System, СКВ) Git, а также с его неизменным спутником, хранилищем кода, GitHub.

1. Система контроля версий

Одной из важнейших тем, которую необходимо изучить начинающему разработчику, а также освоить сопутствующие ей приложения, является СКВ. Это must have инструмент для любого программиста, с которым в обязательном порядке нужно уметь работать.
Чтобы было понятнее, что такое СКВ, приведем ряд примеров и задач, которые она призвана решать.
Пример 1
Программист устраивается в компанию, где ему предстоит работать над одним проектом с другими разработчиками. Каким образом он сможет предоставлять свой код коллегам и получать доступ к их наработкам: с помощью какого-то мессенджера, электронной почты, соц. сетей? А если над проектом работает не один десяток или сотня людей, которые используют код друг друга и меняют его ни по одному разу в день?
Пример 2
Наш программист написал работающий код, но, увлекшись его оптимизацией, испортил свою часть работы, да еще и затронул код коллег, от чего программа стала работать не корректно. Как решить такую проблему и вернуться к рабочей версии кода: жать до посинения Ctrl + Z, чтобы откатиться к ней? А если среда разработки не запомнила все изменения и отменить уже ничего нельзя?
Пример 3
Внешняя компания, помогающая разрабатывать приложение, прислала патч с кодом, содержащим ошибку, которую никто вначале не заметил. Из-за этого программа стала уязвима для хакерских атак. Специалист по информационной безопасности спустя какое-то время обнаружил брешь и решил выяснить, кто был автором уязвимого кода. Узнать это не имея на руках все изменения, которые были внесены в проект, достаточно проблематично.
Для решения этих и множества других задач необходимо иметь простой и удобный инструмент, который позволял бы:
  • отслеживать все изменения в коде, которые были внесены разработчиками
  • обмениваться кодом внутри команды
  • хранить все промежуточные версии файлов
  • отменять внесенные изменения в код, откатываясь до любой рабочей версии (как точки восстановления в Windows)
  • видеть, кто и когда вносил изменения в файлы
Для таких ситуаций и были придуманы СКВ, которые стали отраслевым стандартом как для командной разработки, так и среди индивидуальных программистов.
Следует заметить, что СКВ используют не только программисты, но и писатели, дизайнеры, переводчики — все, кому требуется хранить промежуточные версии своих наработок.

2. Виды СКВ

СКВ бывают локальными (ЛСКВ), централизованными (ЦСКВ) и распределенными (РСКВ).

2.1. Первое поколение СКВ

В первом поколении СКВ были локальными: они хранили все изменения файлов на одном устройстве в локальной базе данных. При этом разрешалось только одному пользователю одновременно вносить изменения в файл. Такие системы не предназначены для удобного взаимодействия с удалённой командой. Примером ЛСКВ является SCCS и RCS.

2.2. Второе поколение СКВ

Для решения проблем ЛСКВ были созданы ЦСКВ, которые используют центральный сервер для хранения всех версий файлов. А уже к нему по сети подключаются разработчики для получения, хранение файлов и т. д. Эти системы впервые позволили нескольким разработчикам одновременно работать с одними и теми же файлами. Использование ЦСКВ являлось стандартом на протяжении многих лет. К ним относятся CVS, Subversion и т. д.
ЦСКВ позволяет взаимодействовать между собой удаленным участникам, но при этом все привязаны к одному серверу, где хранятся файлы проекта, что является серьезным недостатком. Если он вдруг станет недоступен или повредится жесткий диск, то ни один из его клиентов не сможет использовать контроль версий, да и это чревато повреждением файлов и потерей части проекта.

2.3. Третье поколение СКВ

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

3. СКВ Git

Git — самая популярная, бесплатная РСКВ с открытым исходным кодом, которая позволяет отслеживать любые изменения в файлах, работать над одним проектом совместно с коллегами, обмениваться кодом и многое другое. С историей возникновения Git можно ознакомиться по этой ссылке.
Распределенность Git означает, что работоспособность системы не зависит от одного центрального сервера, хранящего файлы. Вместо этого любой клиент имеет у себя на компьютере полную версию репозитория (хранилища кода) с историей изменений, сделанными за все время существования проекта. Т. е. код проекта распределяется одинаково между всеми участниками.
Некоторые путают Git и GitHub, но это не одно и тоже. Git — это программа (консольная утилита), которую устанавливает у себя программист для отслеживания и внесения изменений в файлах. GitHub — это сайт (хостинг) для хранения этих изменений и обмена файлами проекта. Его еще называют социальной сетью для программистов. Существуют и другие подобные сайты, например, BitBucket, SourceForge, GitLab и т. д.
Если кратко, то первоначальное взаимодействие Git и GitHub выглядит так: вы устанавливаете Git и подключаете его к своему проекту; регистрируетесь на GitHub; создаете в нем пустой репозиторий; переносите файлы с помощью Git со своего компьютера на GitHub (в облако) для доступа к ним другим участникам команды (или только для себя).

4. Скачивание и установка Git

Скачаем Git с официального сайта и установим к себе на компьютер. Мне нужна версия под Windows.
Запустим скачанный файл и начнем установку.

5. Создание аккаунта и репозитория на GitHub

5.1. Создание аккаунта

Перейдите на сайт github.com и в правом верхнем углу страницы, для регистрации, нажмите Sign up.
Введите свои данные: электронную почту; пароль (рекомендации по созданию надежного пароля); имя, которое будет использоваться на GitHub и подтверждение на рассылку.
После регистрации, на указанную почту, придет письмо: откройте в нем ссылку для подтверждения своего электронного адреса.

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

Следующим шагом является создание на GitHub нового репозитория.
Репозиторий — это просто хранилище для чего угодно. В нашем случае, мы будем хранить в нем код. Репозиториев можно создать неограниченное количество под любой проект. Например, сейчас мы создадим хранилище под названием startjava2 (вам цифру 2 писать не нужно). А в будущем еще несколько под разными названиями: basejava, topjava — в них будет храниться код, связанный с этими проектами.
Чтобы создать новый репозиторий, нажмите на сайте GitHub в правом верхнем углу + и выберите New repository.
Откроется новая страница с первоначальными настройками, где нужно ввести имя репозитория и краткое описание (необязательно). Также необходимо пометить, чтобы он был Public (при Private доступ к репозиторию будет только по приглашению). Все остальное мы настроим позже.
Нажав Create repository, вас перекинет на страницу со ссылкой на созданный репозиторий и набором стандартных команд, которыми мы воспользуемся в следующей статье.
Репозиторий создан!

6. Способы авторизации

Доступ к репозиториям на GitHub из командной строки можно получить двумя способами: по протоколу HTTPS или SSH.
С 13 августа 2021 г. GitHub отменил использование паролей для аутентификации из командной строки с помощью Git в пользу токенов персонального доступа (Personal access tokens, PAT). Эти шаги были сделаны с целью повышения безопасности пользователей.

6.1. Токен персонального доступа и HTTPS

Для доступа (авторизации) к GitHub по протоколу HTTPS необходимо создать PAT.
Преимущества PAT перед паролями:
  • возможность генерации токена для каждого устройства, с которого необходимо получать доступ к репозиторию на GitHub
  • возможность настройки ограничений для каждого токена при работе с GitHub
  • возможность аннулирования токена для конкретного устройства
  • возможность ограничить срок действия токена

6.1.1. Создание токена

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

Username: ваш email
Password: ваш токен
В Windows Git для хранения учетных данных пользователей поставляется с диспетчером учетных данных (Git Credential Manager for Windows, GCM). Мы с ним встречались во время установки Git. Он по умолчанию сохраняет учетные данные, что позволяет не вводить их все время.
Для просмотра его конфигурации введите следующую команду:

git config credential.helper
Если вы используете Git версии 2.29 или более позднюю, то в консоли отобразится надпись manager-core. Для более ранних версий credential.helper имеет значение manager.
Если команда выдаст что-то отличное от manager-core, то введите:

git config --global credential.helper manager-core

7. Доступ через SSH

Если среди начинающих про HTTPS знают все, то про SSH многие даже и не слышали. Исправим это, проведя вводный ликбез, а заодно и узнаем про доступ к GitHub через данный протокол.
SSH (Secure SHell, «безопасная оболочка») — это сетевой протокол, обеспечивающий шифрование передаваемых данных, а также защищенный доступ к удаленному серверу.
Подключаться к удаленному серверу можно как с помощью пароля, так и посредством двух ключей (публичного и приватного), которые нам нужно создать — второй способ наиболее предпочтителен.
В терминале пишем команду ssh-keygen (после все время жмем Enter, ничего не вводим).
В итоге по адресу C:\Users\Имя_пользователя\.ssh будет создано два файла: id_rsa (приватный — никому его не показывайте) и id_rsa.pub (открытый — можете показывать кому угодно).
Чтобы проще запомнить назначение ключей, их можно представить, как замок (открытый) и ключ к замку (закрытый). Замок без ключа не открыть, а при этом замок может видеть кто угодно.
Данные ключи являются взаимозависимыми: зашифровав информацию одним ключом, расшифровать ее можно только другим. Например, если вы зашифровали pdf-документ публичным ключом (ставите на него замок), то открыть и прочитать его сможете только вы, т. к. только у вас есть закрытый ключ. Так же это работает и в обратную сторону: если вы зашифруете письмо приватным ключом, то расшифровать его можно только вашим публичным ключом.
Это также означает, что так как ваш публичный ключ может распространяться открыто, то любой, кто им обладает (коллега), сможет открыть зашифрованный документ. Но в этом нет опасности, т. к. это лишь гарантирует, что документ был зашифрован именно вами. По такому принципу работает цифровая подпись.
Зайдите внутрь файла с открытым ключом обычным текстовым редактором и скопируйте его содержимое.
Для создания SHH-ключа необходимо выполнить следующие шаги:
Для проверки работоспособности ключей, необходимо выполнить какие-то действия с Git, которые будут обращаться к GitHub. Используем простую команду clone, которая копирует любой репозиторий с GitHub на компьютер. Зайдите на страницу созданного ранее репозитория, и скопируйте его ssh-адрес.
Выполните в консоли команду git clone (напишите yes, где потребуется), открыв ее в любом месте, например, на диске D:\. После успешного клонирования удалите полученные файлы.

8. Установка Octotree

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

9. Настройка Git

9.1. Создание локального репозитория

Перед использованием Git необходимо создать локальный репозиторий и выполнить настройку.
Внешний репозиторий мы уже создали на GitHub, но он пока пуст.
Укажем Git на корневую папку нашего проекта, чтобы он мог отслеживать в ней все изменения.
Для этого существует команда init, отвечающая за создание репозитория, т. е. места на компьютере, где хранятся файлы и папки проекта.
Репозиторий будет размещаться в папке StartJava. Именно в ней мы будем хранить все подпапки и классы, связанные с изучаемыми темами в рамках всего цикла статей для начинающих Java-программистов.
Откроем cmder в папке StartJava и введем git init:

D:\Java\StartJava
> git init
Initialized empty Git repository in D:/Java/StartJava/.git/
Просто init мы не можем написать, т. к. будет непонятно к чему относится данная команда. Поэтому необходимо в начале писать git, а только потом нужную команду.
Репозиторий успешно создан. В результате в консоли стало отображаться слово master, а в папке StartJava появилась скрытая папка .git (с точкой в начале), где и будет в дальнейшем храниться информация обо всех изменениях, сделанных в репозитории. Отобразим его:

D:\Java\StartJava (master)
> ls -a
./  ../  .git/  about.txt  src/

9.2. Настройка Git

В Git существуют аж целых три файла для хранения настроек. Чтобы понять зачем столько и что это за настройки, давайте отобразим их содержимое. Сильно вдаваться в подробности мы не будем, но для общего понимания этот вопрос стоит разобрать. Введем команду git config -l --show-origin:
Подробную справку к любой команде Git можно получить, написав git <команда> --help. Она отобразится отдельной страницей в окне браузера. Для получения краткой справки в терминале используется ключ -h.
Например:

git config --help
git config -h
Подробности смотрите по ссылке.
Выведенную в терминале информацию я разбил на три части (по количеству файлов). Каждая часть содержит настройки и путь до содержащих их файлов.
В красной рамке выделены системные настройки, которые содержат общие для всех пользователей и их репозиториев значения (не забываем, что учетных записей пользователей в системе может быть больше одной).
В синей рамке выделены глобальные настройки для одного конкретного пользователя и всех его репозиториев.
Зеленой рамкой выделены настройки, созданного на компьютере репозитория.
Запомнить, какой файл с настройками когда использовать, несложно:
  • Если в вашей системе один пользователь, то системные настройки вам ни к чему
  • Если вы планируете для всех своих репозиториев использовать одни и те же параметры, то подойдут глобальные настройки
  • Если для какого-то репозитория необходимо установить свои параметры, отличные от других, то используйте локальные настройки
Исходя из всего выше сказанного, нам подходят глобальные настройки (у меня они уже выставлены). Если нужно будет в будущем внести какие-то отличные от глобальных настроек параметры, то вы всегда сможете воспользоваться локальными настройками.

9.3. Установка личной информации

В первую очередь, укажите электронную почту и имя на GitHub. Эти данные нужны для подписи изменений, которые будут вноситься в репозиторий, чтобы было видно, кто изменил, добавил, удалил код.

git config --global user.email ВАШ_ЕМЭЙЛ
git config --global user.name ВАШЕ_ИМЯ
Параметр --global позволяет выставить один раз нужные настройки, которые Git будет использовать для всех репозиториев на вашем компьютере.
Отобразим внесенные изменения:

> git config --get user.name & git config --get user.email
ВАШЕ_ИМЯ
ВАШ_ЕМЭЙЛ
Если для каких-то отдельных репозиториев необходимо указать другое имя или электронную почту, то используйте параметр --local. При этом нужно обязательно находиться в папке репозитория, а иначе команда не сработает.

9.4. Установка текстового редактора

Если вам требуется изменить текстовый редактор, который будет запускать Git при необходимости, то для начала нужно найти его расположение на вашем диске. В официальной документации к Git есть таблица с подсказками по поводу места размещения и параметров для разных редакторов. Либо вы можете найти его самостоятельно с помощью команды where, которую мы использовали во второй части.
Для смены редактора (хоть мы его и указали во время установки, но знать, как его изменить — лишним не будет) и отображения результата выполните команды:

> git config --global core.editor "'C:\Program Files\Sublime Text\sublime_text.exe\' --wait"

> git config --get core.editor
'C:\Program Files\Sublime Text\sublime_text.exe' --wait
Обратите внимание, что я добавил дополнительные одинарные кавычки (апострофы) в путь до текстового редактора (помимо двойных кавычек). Это сделано из-за наличия в пути пробелов (если у вас их нет, то и кавычки не нужны). Без дополнительных кавычек редактор не запустится.
Также я добавил параметр --wait, который не позволит закрыться редактору, пока вы его сами не завершите. Без него в будущем возникла бы ошибка «aborting commit due to empty commit message» при использовании команды commit (ее мы пройдем позже).

9.5. Смена имени ветки по умолчанию

Если по какой-то причине вам захочется поменять слово master (название ветки по умолчанию) на что-то другое, например, сейчас идет тренд в пользу main, то выполните команду:

git config --global init.defaultBranch main

9.6. Корректное отображение русских букв

Для тех, кто использует Windows с именами для папок и файлов на русском языке, необходимо выполнить команду:

git config --global core.quotepath off
Если этого не сделать, то все сообщения, в которых фигурируют русские символы, будут нечитаемы.
Я переименовал src в срс и выполнил git status (ее мы пройдем позже). Вместо срс отобразилось "\321\201\321\200\321\201/".
После выполнения настройки, русский текст будет отображаться корректно.
Дополнительную информацию про настройку Git можно посмотреть по ссылке.

Заключение

В этой вводной статье мы рассмотрели основы СКВ, их виды, а также выполнили установку и настройку Git, создали аккаунт на GitHub. В следующей публикации мы подробно рассмотрим основные команды Git, которые позволят вам начать с ней работать.
Автор: Чимаев Максим
Оцените статью, если она вам понравилась!