2. Git. GitHub. Погружаемся - qa-guru/knowledge-base GitHub Wiki
Git — система управления версиями с распределенной архитектурой. Можно считать лидером в области ПО для контроля версий. Главным отличием от некогда популярных CVS и SVN является именно распределенная архитектура. Если раньше единственная версия проекта и вся история изменений хранилась исключительно в одном месте, то с приходом Git каждая рабочая версия стала полноценным репозиторием. Это позволяет каждому участнику проекта локально хранить всю историю изменений и код.
Предполагается, что на вашей машине уже установлен Git, вы уже попробовали клонировать репозиторий и выполнили первое домашнее задание. Если нет, то по этой ссылке можно посмотреть инструкцию по установке Git, а по этой по клонированию репозитория и запуску первого теста.
Полезно: Маленькая шпаргалка по основным командам Git от команды GitHub Education.
GitHub — один из самых крупных и популярных сервисов для хостинга IT-проектов и совместной работы над ними. GitHub построен на базе Git, а значит поддерживает всего его функции. Кроме основных функций в GitHub есть и другие, добавленные разработчиками сервиса: контроль доступа к коду, базы знаний, управление задачами, интеграцию с другими сервисами, запросы на принятия изменений и другие. Кроме GitHub есть и другие сервисы онлайн-хостинга репозиториев: GitLab и Bitbucket.
Интерфейс GitHub выглядит следующим образом:
Скриншоты (нажать, чтобы раскрыть)
На первом скриншоте:
- Блок с информацией о пользователе: аватар, имя пользователя, никнейм, поле «О себе», количество подписчиков и подписок, место работы, локация, адрес электронной почты, ссылка на сайт (еще можно добавить ссылку на Twitter), значки сообщества и список организаций.
-
Панель переключения вкладок:
- Overview — просмотр главной страницы профиля (то, что на скриншоте);
- Repositories — список репозиториев пользователя;
- Projects — своеобразный планировщик задач, привязанный к GitHub. Пока доступен в бете;
- Packages — вкладка с пакетами, опубликованными пользователем;
- Stars — репозитории, отмеченные «звездочкой». В GitHub можно ставить «звездочки» чужим репозиториям. К примеру, если нашли интересный проект и хотите позже предложить разработчикам свои идеи или просто установить, то можно отметить его «звездочкой», тогда он появится в этой вкладке.
- Кастомизируемый блок с информацией: это опциональный блок, при желании можно оформить небольшое подобие резюме с основными данными и проектами. Для работы с функционалом есть полная поддержка Markdown и поддержка основных HTML-тегов. Если не оформлять эту часть, то на ее месте будет блок с популярными репозиториями пользователя.
На втором скриншоте (если пролистать страницу профиля ниже):
- Блок с закрепленными репозиториями: GitHub позволяет закрепить на главной странице профиля до шести репозиториев, они будут сразу видны всем посетителям страницы.
- Количество вкладов: в этом блоке можно увидеть количество вкладов за все время, а также за последний год, месяц и неделю. При нажатии на любой из периодов можно увидеть график с количеством коммитов за этот период.
- Описание деятельности: в этом блоке доступно описание деятельности пользователя на GitHub. Например, сколько и в каких репозиториях было коммитов, сколько было открыто и закрыто запросов на изменения и т.д.
Git-сервисы используют аутентификацию по SSH-ключам. Это значит, что для того, чтобы работать с репозиторием, нужно сгенерировать SSH-ключ и добавить его в профиль на GitHub.
Сперва следует проверить нет ли уже сгенерированного SSH-ключа, который можно использовать. Процесс идентичен для всех ОС. Все пользовательские SSH-ключи по умолчанию хранятся в каталоге ~/.ssh
. Поэтому перейдем в него и проверим содержимое:
$ cd ~/.ssh
$ ls
known_hosts
Файлы id_dsa
или id_rsa
и есть то, что нам нужно. Файлы с расширением .pub
— открытые ключи, остальные — приватные. Если файлов нет или даже нет каталога .ssh
(в нашем примере каталог есть, а вот файлов нет), то все это можно сгенерировать.
Для этого можно воспользоваться утилитой ssh-keygen
. На macOS и Linux она является частью пакета SSH, а на Windows поставляется вместе с Git:
$ ssh-keygen -o
Generating public/private rsa key pair.
Enter file in which to save the key (/home/daniilshat/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/daniilshat/.ssh/id_rsa
Your public key has been saved in /home/daniilshat/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:Eep/BjjzpZzyiNhXNLTlLbmOQhTeAsg2HFigZ1+yku8 daniilshat@workstation
The key's randomart image is:
+---[RSA 3072]----+
|.*oo . |
|o * . ..... |
|..o..oo+.+ o |
| o o =+.=.+ . |
| o o.=oS..o |
| o .*.=. |
| ....*oo |
| + .o+.o. |
| . E.... |
+----[SHA256]-----+
Сперва система предложит директорию для сохранения по умолчанию, проверьте, чтобы было предложено сохранить в .../.ssh/id_rsa
. Если вдруг будет что-то другое (это маловероятно), укажите верный путь. Далее утилита попросит ввести пароль для приватного ключа и повторить его. А потом выдаст сообщение об успешной генерации.
SSH-ключ выглядит вот таким образом:
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDV5eqahOIl2Dn+YZmsKZ7OcjxvjN6TIcsGiKIcXHgxVQ+oM3vGY6E2vZxJ+hCpYYdESTjytGILgbfLBMj5cRjxczzvIUqfjumwF8goPDA/po9gUV5BFLxd4vopIPCFTK1X2MW6aLV+30xAvNjP9OR0bvNGA6/Ib8kbNZcMRlXLResEkjiz/KmAcINhbOUkh5NEhhx7kVV/LaEQyltJ/azdiLtFcE4zom5nl1F9hL+nZyvr+0sVYcsgJvIKiWjhL2pQCiZgamo+lBJwoBdKnjGHmMtsZ4u/Sc2rG2eVRe8HKAqJRVFmbzDojuuE1iGZFJAZ1dK0cMprHKFkanzgPl95N2AnRfmrCtsRdviFhGPqPm6LKDxMFfyKDvZV2jayrwtFNCk5ey01VQR4l1YjuCijCAhYaoVUItVe8T31oV1DOejQVBkntiuk2ks6gcTWua4PvnB8vN6Xo/WOwVrCd9VJLlQEX98CnElqnlJ117kJM9TvRIFzwsrDz7KuQZT6OhM= daniilshat@workstation
Далее необходимо добавить сгенерированный SSH-ключ в GitHub. Для этого переходим в свой профиль. В правом верхнем углу кликаем на миниатюру со своей аватаркой и в открывшемся меню переходим в пункт «Settings».
Скриншот (нажать, чтобы раскрыть)
На открывшейся странице переходим в «SSH and GPG keys».
Скриншот (нажать, чтобы раскрыть)
Нажимаем на кнопку «New SSH key».
Скриншот (нажать, чтобы раскрыть)
На открывшейся странице:
- В «Title» введите какое-то название ключа или его идентификатор. К примеру, название машины на которой вы создали ключ и собираетесь работать (Пример: Home MacBook Air);
- в поле «Key» вставьте сам сгенерированный ключ;
- Нажмите «Add SSH key».
Скриншот (нажать, чтобы раскрыть)
Далее GitHub попросит ввести пароль от аккаунта и добавит ключ, а на почту придет уведомление о том, что все прошло успешно. Страница с ключами будет выглядеть вот так:
Скриншот (нажать, чтобы раскрыть)
Для создания репозитория есть 2 пути:
- Перейти во вкладку
Repositories
и нажать на зеленую кнопкуNew
. - В верхней част страницы кликнуть на иконку
+
и выбратьNew repository
.
На открывшейся странице необходимо:
Скриншот (нажать, чтобы раскрыть)
- Указать имя репозитория;
- Добавить описание (необязательное поле);
- Выбрать настройки приватности (публичный репозиторий или приватный);
- Добавить
README.md
,.gitignore
и выбрать лицензию. .gitignore можно сгенерировать в зависимости от используемого языка программирования. Для того чтобы создать именно для Python, необходимо кликнуть наgitignore template
и выбратьPython
из списка. - Нажать зеленую кнопку «Create repository».
Для инициализации репозитория необходимо в папке с проектом вызвать команду git init
. В этот момент система создаст скрытую папку .git
и будет сохранять в ней служебные файлы. Если ее удалить, то Git потеряет данные о репозитории и перестанет отслеживать изменения в проекте.
Важно: вызывать
git init
необходимо в папке с проектом.
Для добавления изменений необходимо вызвать команду git add <название файла>
. В этом случае Git добавит в индекс файл в текущем его состоянии. Если необходимо добавить не один файл, а все содержимое проекта, то следует вызвать git add .
. Следует использовать внимательно и осторожно, иначе можно закоммитить много лишнего.
Важно: Индекс в Git — специальная промежуточная область, хранящая в себе изменения файлов на пути от рабочей папки до репозитория.
Если в индекс попало лишнее, то такие файлы можно удалить из индекса с помощью команды git rm --cached <название файла>
. Весь индекс сразу можно очистить с помощью git rm --cached .
Во время работы над проектом IDE и другие инструменты, создают много служебных файлов, которые не несут в себе практической пользы для разработчика. Их не надо коммитить в репозиторий и чтобы в ручную не отслеживать их состояние, можно указать список этих файлов в .gitignore
-файле. Такой файл можно написать самостоятельно, а можно сгенерировать на сайте.
Для контроля статуса всех файлов проекта можно воспользоваться командой git status
. Система выведет список файлов в индексе, не отслеживаемых файлов и удаленных из индекса.
В локальном репозитории изменения можно зафиксировать с помощью команды git commit -m "Ваше сообщение"
. После вызова все файлы из индекса попадут в локальный репозиторий. Поэтому перед вызовом git commit
необходимо выполнить git add
. Также в строчке сообщений важно указывать осмысленные сообщения о внесенных изменениях.
Сперва необходимо создать сам проект, проинициализировать в нем локальный репозиторий с помощью git init
(смотри выше) и создать репозиторий на GitHub (смотри выше).
После создания пустого репозитория в GitHub на его странице увидим следующую инструкцию:
Если до этого все сделали правильно, то необходимо будет только выполнить команду git remote add origin <SSH-репозитория или HTML-репозитория>
.
origin
— псевдоним удаленного репозитория с помощью которого Git понимает, что мы собираемся вносить изменения именно в удаленный репозиторий. Он понадобится нам для выполнения команды push
.
Для отправки изменения в удаленный репозиторий GitHub предусмотрена команда push
. Если мы делаем первый пуш, то необходимо вызвать команду в следующем виде и обязательно с ключом -u
: git push -u origin <название ветки>
. Далее просто git push origin <название ветки>
.
Ветки в Git помогают вносить изменения в код и не портить основной проект. Главная ветка с кодом основного проекта — master
(иногда main
, но это не так важно, оба названия указывают на то, что эта ветка главная). В любой момент времени от основной ветки можно создать новую с копией кода и продолжить работать в ней, а после слить с основной.
Основные команды:
- Создать новую ветку —
git branch <имя ветки>
- Посмотреть список веток —
git branch
- Переключиться на ветку —
git checkout <имя ветки>
Для слияния веток необходимо вызвать команду git merge <имя сливаемой ветки>
.
Разберем на примере. Условно у нас есть ветка master
с основным проектом. Мы начали разрабатывать новую фичу и создали для работы ветку feature
. Через некоторое время мы закончили и решили, что пора добавить наши изменения в основную ветку. Для этого необходимо перейти в ту ветку, в которую мы будем включать изменения и вызвать git merge
.
$ git checkout master
Switched to branch 'master'
$ git merge feature
Merge made by the 'recursive' strategy.
GitHub не позволит нам просто так внести изменения и все испортить. Сперва наш код должны проверить. Для этого есть Pull request — механизм запросов на слияние ветки с master
. После того как мы выполнили команду merge
в основной ветки и слили свою с основной, в GitHub-репозитории появится запрос на создание Pull request. Нажимаем на зеленую кнопку.
Скриншот (нажать, чтобы раскрыть)
Далее мы увидим страницу pull request, на ней есть:
- Визуализация того, какие ветки предлагается слить;
- Строка сообщения;
- Поле подробного комментария;
- Возможность пригласить других пользователей для ревью кода.
Заполняем все поля и нажимаем на зеленую кнопку «Create pull request».
Скриншот (нажать, чтобы раскрыть)
На открывшейся странице мы можем посмотреть изменения в файлах (1) и одобрить слияние веток, если все в порядке (2):
Скриншот (нажать, чтобы раскрыть)
После того как мы слили ветки, GitHub предложит нам удалить уже отработанную ветку, примем предложение:
Скриншот (нажать, чтобы раскрыть)
Вероятно, что когда мы отдыхали, кто-то из команды работал и активно вносил изменения в главную ветку или наши ветки. Все эти изменения уже есть в удаленном репозитории, но теперь надо получить их и в нашем локальном репозитории. Для этих целей есть команда git pull
.