Знакомство с Git

Значение для курса

Все последующие выполненные задания (лабораторные работы) должны загружаться в систему GitHub. В качестве ответа на задание необходимо прикреплять ссылку на репозиторий в GitHub.

Введение

Git - система контроля версий, которую используют разработчики ПО для:

Представьте, что вы пишете книгу. Без системы версий каждое исправление - это перезапись файла. Удалили удачную главу вчера - вернуть нельзя. Git же делает «фотографии» проекта в ключевые моменты. Каждая такая «фотография» называется коммитом. Благодаря такой системе, можно:

По-умолчанию, система Git - это чисто локальная система. Для того, чтобы хранить проект (репозиторий Git) в облаке и фиксировать изменения туда, существуют специальные серверы: GitHub, GitLab, BitBucket, GitVerse, GitFlic и другие. Самым популярным является GitHub, поэтому в дальнейшем курсе будет ориентация именно на него.

Настройка Git на компьютере

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

Задание №1 На основе приведённых источников выполните действия 1 - 4 на своём компьютере. Составьте краткий отчёт, где показано выполнение каждого пункта. Пункты должны сопровождаться скриншотами. Если у Вас уже есть GitHub аккаунт, то зарегистрируйте новый.

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

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

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

Рисунок 1 – Создание нового репозитория

После создания репозитория, пользователя перебрасывает на его страницу. Сейчас в репозитории не хранится ни одного файла.

Однако, все файлы в репозиторий нам не надо помещать. В директории, помимо кода, находятся также и артефакты сборки (.dll, .exe файлы), временные файлы, создаваемые средой разработки. Чтобы их не загружать в репозиторий, необходимо создать файл .gitignore, в котором перечислены файлы/директории, которые стоит игнорировать. Для языков программирования C++, C# рекомендуется использовать шаблон из приложения к уроку (template_gitignore.txt). Данный шаблон необходимо скопировать в корень решения и переименовать в «.gitignore».

Чтобы существующий проект на компьютере залить в репозиторий, необходимо открыть командую строку/терминал в корне решения и выполнить команды:

Команда Описание
1. git init локально проинициализирует Git для решения
2. git add . локально зафиксирует все файлы для коммита кроме тех, что указаны в .gitignore
3. git commit -m “first commit” локально из зафиксированных файлов создаст коммит
4. git branch -M main локально создаст ветку main, в которую попадёт ранее созданный коммит
5. git remote add origin «SSH-ссылка на репозиторий» создаёт связь локального git с GitHub
6. git push -u origin main публикует созданную ветку в GitHub

После выполнения данных действий, в репозитории появится решение из локальной директории.

Задание №2 Выберите на сайте LeetCode (https://leetcode.com/problemset/) любую задачу и оформите её решение в виде отдельного C++ решения. Залейте оформленное решение в репозиторий GitHub. Составьте краткий отчёт, где показано выполнение каждого пункта. Пункты должны сопровождаться скриншотами.

GitFlow

GitFlow - наиболее популярный подход к управлению ветками в системе Git. Основная идея заключается в разделении кодовой базы на несколько веток с разными уровнями стабильности.

Согласно данному подходу, выделяют следующие ветки:

Стоит понимать, что первое время смысла создавать ветку dev нет. Её стоит создавать тогда, когда уже появится первый рабочий прототип решения.

Пример создания веток

Во многие современные IDE встроены удобные инструменты по работе с Git. Примеры будут приводиться для редактора кода Rider.

Ранее в существующее решение был добавлен Git. Теперь при открытии решения в редакторе кода появляется возможность управлять ветками, делать коммиты и загружать изменения в GitHub.

Разберём использование инструментов Git на примере добавления README.MD файла, который содержит описание решения и примеры использования кода.

Создадим ветку «feature/add-readme-file» от текущей «main»:

Переход к списку веток

Рисунок 2 – Переход к списку веток

Переход к созданию ветки

Рисунок 3 – Переход к созданию ветки

Ввод имени для ветки

Рисунок 4 – Ввод имени для ветки

Теперь добавим README файл в интересующий нас проект решения:

Добавление файла

Рисунок 5 – Добавление файла

Ввод названия для файла

Рисунок 6 – Ввод названия для файла

Далее, после создания файла, его необходимо заполнить. В тексте этого файла можно выделять заголовки, вставлять фрагменты кода и т.д. Для заполнения файла наиболее оптимально использовать GPT-модели. Ниже приведён пример запроса:

Я не знаю, как писать текст в README.MD файле. Давай я тебе декларативно опишу текст, который я хочу видеть, а ты его преобразуешь в язык разметки Markdown?

Data analyze (заголовок первого уровня)

Purpose (заголовок второго уровня)

This module is designed for analyzing data from a statistical perspective:

1) determining whether the data is normally distributed;

2) identifying data that stands out from the general background.

Usage (заголовок второго уровня)

All functions declared in NormalizeChecker class.

WARNING: Class is not implemented now

Все сделанные изменения отображаются во вкладке «Commit» (Рисунок 7).

Список изменений

Рисунок 7 – Список изменений

Видно, что есть группы «Staged» и «Unstaged». В группе «Staged» содержатся изменения, которые попадут в будущий коммит. Те изменения, которые отображаются в группе «Unstaged», в коммит не попадут. Для того, чтобы изменения из «Unstaged» переместились в «Staged», необходимо нажать на значок плюс у нужной папки или файла (Рисунок 8).

Фиксация изменений

Рисунок 8 – Фиксация изменений

После того, как нужные изменения внесены и выбраны, их необходимо зафиксировать, создав коммит. Для этого необходимо сначала ввести текст коммита, а затем нажать на кнопку «Commit and Push». Текст коммита стоит делать кратким, отражающим суть внесённых изменений (Рисунок 9).

Создание коммита

Рисунок 9 – Создание коммита

После этого, в репозитории GitHub появится ещё одна ветка «feature/add-readme-file» (Рисунок 10).

Ветки в GitHub после фиксации изменений

Рисунок 10 – Ветки в GitHub после фиксации изменений

При этом, в ветке «main» файла README.MD не будет, а в ветке «feature/add-readme-file» - будет (Рисунок 11).

Наличие файла в разных ветках

Рисунок 11 – Наличие файла в разных ветках

Чтобы изменения, сделанные в ветке «feature/add-readme-file» попали в основную ветку «main», необходимо создать «Pull Request» на слияние веток. Для этого необходимо:

Создание Pull Request

Рисунок 12 – Создание Pull Request

Выбор веток для слияния

Рисунок 13 – Выбор веток для слияния

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

Рисунок 14 – Слияние веток

Удаление ветки после слияния

Рисунок 15 – Удаление ветки после слияния

Теперь файл «README.MD» содержится в основной ветке main.

Задание №3 Добавьте в основную ветку репозитория файл README.MD, создав Pull request на основе приведённого выше примера. В файле приведите описание задачи, которую решает программа. Составьте краткий отчёт, где показано выполнение каждого пункта. Пункты должны сопровождаться скриншотами.

← Назад к оглавлению

Следующая тема: Введение в ООП. Инкапсуляция →