"Мобильная" разработка. [Системы контроля версий, Git]
Tags: git, bash, github, tutorial
Published: 2023-09-08 09:56:23

## Системы контроля версий

**Системы Контроля Версий (СКВ или SCM)** - это инструменты, которые позволяют отслеживать изменения в коде и других файлах, обеспечивая возможность возвращаться к предыдущим версиям и совмещать изменения от разных источников. В этой статье мы рассмотрим, что такое СКВ, какие их виды существуют и в чём их преимущества. Здесь же подробно рассмотрим и самую популярную СКВ - Git.

### Виды СКВ

Системы контроля версий делятся на два основных типа:

- **Централизованные СКВ (ЦСКВ)**: у таких систем есть единый центральный сервер, на котором хранятся все версии файлов. Примером может служить Subversion (SVN).
- **Распределённые СКВ (РСКВ)**: каждый участник имеет свою локальную копию репозитория (хранилища), содержащую всю историю изменений. Примером является Git.

### Преимущества использования СКВ

- **Отслеживание изменений**: вы всегда можете узнать, кто, когда и что изменил.
- **Совместная работа**: несколько разработчиков могут одновременно работать над проектом без конфликтов.
- **Безопасность**: в случае ошибок или сбоев можно легко вернуться к стабильной версии.
- **Эффективное слияние**: СКВ помогает объединять изменения из разных веток разработки.

### Популярные системы контроля версий

Из самых распространённых систем контроля версий следует выделить следующие:

- **Git**: наиболее популярная РСКВ, используется в таких сервисах, как GitHub, GitLab и Bitbucket.
- **Subversion (SVN)**: ещё одна популярная ЦСКВ, но менее актуальная, нежели Git.
- **Mercurial**: РСКВ, во многом похожая на Git, но с некоторыми отличиями в интерфейсе и подходах.

## Git

**Git** - это распределённая система контроля версий, которая позволяет нескольким разработчикам одновременно работать с одним и тем же кодом, не мешая при этом друг другу. Она была создана Линусом Торвальдсом в 2005 году для разработки ядра Linux. Сегодня Git является одной из самых популярных и распространённых систем контроля версий.

### Основные понятия Git

- **Репозиторий (repository)**: это хранилище, в котором находятся ваш код, история всех изменений, ветки для разработки и другая важная информация.
- **Коммит (commit)**: отдельное изменение или набор изменений. Каждый коммит имеет свой уникальный идентификатор.
- **Ветка (branch)**: независимый поток разработки. С помощью веток можно разрабатывать новые функции, не затрагивая основной код.
- **Слияние (merge)**: процесс объединения изменений в одной ветке с изменениями в другой.
- **Rebase**: это процесс переприменения коммитов из одной ветки на другую. В отличие от слияния, которое объединяет историю двух веток, rebase создаёт новые коммиты для каждого коммита в исходной ветке. Это делает историю коммитов более линейной.

### Установка Git

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

1. **Перейдите на сайт GitHub**: откройте веб-браузер и перейдите на [github.com](https://github.com/).
    ![Github homepage](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3b7w3d8lp8um98055oso.png)
2. **Регистрация**: на главной странице вам будет предложено создать учётную запись (Sign up). Введите адрес электронной почты, пароль и желаемое имя пользователя.
![Sign up example](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x2x8pb9swzqbdiwhbv0h.png)
3. **Подтверждение регистрации**: после ввода данных нажмите на кнопку "Sign up for GitHub". Вам может быть предложено решить простую капчу для подтверждения, что вы не робот.
4. **Выбор тарифного плана**: GitHub предлагает различные тарифные планы, включая также и бесплатный. Выберите тот, который подходит вам лучше всего. Для большинства индивидуальных пользователей и малых проектов бесплатного плана будет достаточно.
5. **Настройка дополнительных параметров**: вам может быть предложено ответить на несколько вопросов, чтобы помочь GitHub понять, как вы планируете использовать платформу. Этот шаг можно пропустить.
6. **Подтверждение электронной почты**: перейдите на свой почтовый ящик, который вы указали при регистрации. Вы должны получить письмо от GitHub с ссылкой для подтверждения вашего адреса электронной почты. Нажмите на эту ссылку, чтобы завершить процесс регистрации.
7. **Завершение регистрации**: после подтверждения адреса электронной почты вы будете перенаправлены на GitHub, где сможете начать работу с платформой.
![Gtihub dashboard](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j0ksmrp18ui1wkqoseh7.png)

Теперь мы можем установить `git` в наш эмулятор консоли Termux. Для этого используем стандартный пакетный менеджер `pkg`:
```bash
pkg install git
```
И сразу же проверим доступность новой команды, выведя её версию:
```bash
git -v
```

![git installation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jk0o92y1rl9u1fukcywn.png)

### Настройка git

После установки нам следует сразу же настроить git. И начнём мы с настройки пользователя. Для этого нужно установить своё имя и адрес электронной почты. Это важно, потому что каждый коммит в Git содержит эту информацию:
```bash
git config --global user.name "ваш юзернейм, который вы указали при регистрации в GitHub"
git config --global user.email "ваша_почта@example.com, которую вы указали при регистрации в GitHub"
```
Для моего случая это будет:
![my git config fill](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j3xxtddhp6xb7ojf7331.png)
Настройка цветового вывода команд:
```bash
git config --global color.ui true
```
Чтобы проверить установленные настройки:
```bash
git config --list
```
![config list](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yadzsa47nsb91gcv7sgv.png)
Теперь же **очень важно** настроить авторизацию с GitHub. При каждом взаимодействии с GitHub (например, когда вы загружаете свои изменения или подтягиваете их с сервера) вам нужно будет авторизоваться. Самый простой, безопасный и общепринятый вариант авторизации при работе с `git` - это использовать **SSH ключи**.

1. Для начала нам скорее всего понадобится установить OpenSSH локально. Для этого мы снова можем использовать `pkg`:
```bash
pkg install openssh
```
![openssh installation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c3n2e7kq1zlowz9yx2pv.png)
2. Сгенерируем ключи для GitHub:
```bash
cd ~/.ssh
ssh-keygen
```
![ssh-keygen](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7d82xrslcgw8iu9l6wxu.png)
3. Теперь нам нужно скопировать наш публичный ключ. Он нам понадобится для настроек GitHub.
```bash
cat id_rsa.pub
```
![public key example](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vyn0fwlwmmjlv4tr8h3k.png)
Чтобы скопировать текст в Termux, нужно зажать текст, который вы хотите выделить, и тогда появятся стандартные кнопки для выделения и кнопка скопировать. Выделяем **весь выведенный** текст и копируем его:
![termux copy](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yhkg546xccz33sanji2k.png)

Теперь переходим в настройки аккаунта Github, чтобы установить наш публичный SSH ключ.
1. Откроем боковое меню, нажав на аватарку:
![Side menu](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b35w45n8kbnbl2tuhk9i.png)
2. Выберем настройки:
![settings](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2m7esca74cya4adyzpqm.png)
3. На странице настроек выберем *"SSH and GPG keys"*:![ssh gpg keys](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p2qk3jyed1nu5xu2mc28.png)
4. И нажимаем на *"New SSH Key"*, чтобы добавить наш SSH ключ:
![Add new SSH Key](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xhpcjvnn4ixfuwlwyggm.png)
5. Теперь мы можем заполнить форму для добавления SSH ключа. Названия ключа может быть любым, но лучше всего указать *"termux"*, чтобы потом точно знать, к какому именно устройству привязан ключ. Тип указываем или оставляем *"Authentication key"* и вставляем скопированный публичный SSH ключ из Termux. После чего нажимаем *"Add SSH Key"*, чтобы сохранить его.
![new ssh key addition page](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7lnpjx68o640ogrbjvpz.png)
6. Если вы всё сделали правильно, то после добавления появится сообщение об успешном добавлении нового SSH ключа:
![SSH success message](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x3jiwhnkxhdcag4zta51.png)

Теперь мы настроили git, подключили его к GitHub и можем приступить к созданию своего первого репозитория.

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

**Репозиторий Git** - это специально организованное хранилище, в котором сохраняется история изменений проекта и различная информация, необходимая для работы системы контроля версий Git. Простыми словами, это место, где Git хранит все данные о вашем проекте.

Существуют два основных типа репозиториев Git:

- **Локальный репозиторий**: это репозиторий, который находится на вашем компьютере. Когда вы инициализируете новый репозиторий с помощью команды `git init` или клонируете существующий репозиторий с помощью `git clone`, вы работаете с локальным репозиторием. Он содержит все коммиты, ветки, теги и другую информацию, связанную с историей проекта.
- **Удалённый репозиторий**: это версия вашего репозитория, которая хранится в интернете или на каком-либо удалённом сервере. Примеры платформ для хостинга удалённых репозиториев - GitHub, GitLab, Bitbucket и другие. Удалённые репозитории используются для совместной работы с другими разработчиками, а также для резервного копирования вашего проекта. Команды, такие как `git push` и `git pull`, позволяют вам взаимодействовать с удалёнными репозиториями, отправляя изменения на сервер или получая изменения с него.

Мы начнем с создания удалённого репозитория:
1. Переходим в GitHub и открываем боковое меню, как мы делали при настройке SSH ключей, и нажимаем на "плюс":
![plus](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqk1dcax7gptxkeih6a6.png)
2. Нажимаем на *"New repository"*:
![New repository](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zfusm9bpnej2eqa6nwa2.png)
3. После этого у нас откроется форма для создания репозитория. Для начала нам будет достаточно просто ввести своё имя для репозитория. Нажимаем *"Create repository"*. Я буду использовать для первого репозитория имя `my-first-repo`:
![first repo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oiojtntd3gmn6f1xpgc5.png) 
![create repository](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e5k8k666zg4yzu01gj4n.png)
4. Теперь нам открылась пустая страница нового репозитория.  Здесь мы выбираем тип SSH и копируем команды для создания репозитория из терминала:
![empty repository page](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fidsq2y156gc15zxmtp0.png)
5. Открываем Termux. В нём переходим в домашнюю папку и создаём папку для репозитория:
```bash
cd
mkdir my-first-repo
cd my-first-repo
```
![folder navigation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/el1zmkp9jgw9mu4f7km3.png)
6. Теперь вставляем команды, которые скопировали из GitHub:
![paste example](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/doy576vmjf2yywdt83mn.png)
7. Вызываем команды, нажав `Enter`:
![git init](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3m4se94idv0j2py6yao9.png)
8. Ответив `yes`, мы закончим процесс создания репозитория:
![git init finish](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bq8n4y4fa16by7d9t6xo.png)

Так мы создали свой первый удалённый репозиторий и его локальную копию. После этого мы можем приступить к созданию коммитов и веток.

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

**Коммит (commit)** - это запись о наборе изменений в репозитории. Суть коммита - зафиксировать текущее состояние проекта в определённый момент времени. Это позволяет разработчикам отслеживать историю изменений, а также возвращаться к любому предыдущему состоянию проекта, если это необходимо.

Каждый коммит в Git содержит:

1. **Ссылку на набор изменений** - детальное описание того, какие файлы были добавлены, изменены или удалены.
2. **Уникальный идентификатор** - идентификатор (обычно хеш SHA-1), который позволяет Git однозначно идентифицировать коммит.
3. **Информацию о коммиттере** - имя и адрес электронной почты того, кто совершил коммит.
4. **Дату и время** создания коммита.
5. **Сообщение коммита** - короткое описание изменений, внесённых в коммит, которое помогает разработчикам понять, что было сделано и почему.

Чтобы создать коммит, нужно выполнить следующие шаги:

1. Вносим изменения в любой файл проекта:
```bash
nano code.sh
```
![code nano](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8qbeh769e16my0n9d49l.png)

![cat code.sh](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sa50k2p9hy7ixus148t4.png)
2. Добавляем эти изменения в индекс с помощью команды
```bash
git add <filename>
```
Обычно для добавления всех изменений вызывают `git add` с текущей папкой `.`:
```bash
git add .
```
3. Фиксируем изменения, создав коммит с помощью команды
```bash
git commit -m "Ваше сообщение о коммите"
```
![git commit](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cn42kzsyrsuvrm6p57e9.png)

С помощью коммитов вы можете просмотреть историю вашего проекта, а также перемещаться между различными состояниями кода. Чтобы вывести историю коммитов, можно использовать команду
```bash
git log
```
![git log](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eayoeyzgjoh2dopbpqqf.png)
*Когда у вас образуется большое количество коммитов, нужно будет нажать* `q`, *чтобы выйти из режима лога.

### Создание ветки

**Ветка (branch)** - это линия развития работы, изолированная от других линий развития. Ветка представляет собой независимый поток изменений, который может быть объединён с главной линией развития или другими ветками в любой момент времени.

Ветвление позволяет работать над различными функциями или исправлениями одновременно, не влияя на основной код проекта. Когда новая функция или какое-то исправление готовы, изменения из этой ветки могут быть объединены (мердж) с главной веткой или другой веткой.

Чтобы создать новую ветку и переключиться на неё, вы можете использовать команду:
```bash
git checkout -b имя_новой_ветки
```
Чтобы переключиться между ветками:
```bash
git checkout имя_ветки
```
Чтобы обновить ветку на GitHub (или другом удалённом репозитории):
```bash
git push -u origin имя_ветки
```

Создадим ветку для нашего изменения:
```bash
git checkout -b new-branch
```
![git checkout](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5qamm3ut75hx7hwhgtdq.png)
И обновим ветку в GitHub:
```bash
git push -u origin new-branch
```
![git push](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m3vsj782rzcs40boe215.png)

Теперь, после того как мы обновили ветку в GitHub, мы можем создать Pull Request, чтобы обновить основную ветку.

### Создание Pull Request

**Пулреквест (Pull Request, часто сокращенно PR)** - это функциональность платформ управления репозиториями, таких как GitHub, GitLab или Bitbucket. Пулреквест представляет собой предложение внести изменения из одной ветки в другую, чаще всего из ветки в вашем форке репозитория в основную ветку оригинального репозитория.

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

Пулреквесты позволяют:
1. **Просматривать изменения**: вы и другие участники проекта можете просмотреть предложенные изменения перед их интеграцией.
2. **Обсуждать детали**: в комментариях к пулреквесту можно обсудить детали предложенных изменений, задать вопросы или предложить дополнения.
3. **Проводить ревью кода**: другие разработчики могут рассмотреть код на предмет ошибок или улучшений.
4. **Тестировать изменения**: некоторые системы позволяют автоматически запускать тесты на код из пулреквеста, чтобы убедиться, что предложенные изменения не нарушают функциональность проекта.

Чтобы создать пулреквест, переходим в наш репозиторий GitHub и переходим во вкладку Pull Request:
1. Во вкладке Pull Request нажимаем на *"New"*:
![PR Page](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sgvbn96b01o7kf7bfrx1.png)
2. Далее выбираем ветку, изменения которой мы хотим внести в основную ветку:
![branch selection 1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0u8drwbd3ydcjtcjzu9d.png)

![branch selection 2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xayyyjit3x1kzn5clbuj.png)
3. После этого нажимаем на "Create pull request". Здесь мы уже можем увидеть, какие изменения будут внесены:
![Create Pull Request](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ih48m1m12fcpn93i7l9p.png)
4. На странице Pull Request можно вести обсуждение по изменению; перейдя во вкладку "Commits", можно увидеть коммиты, которые будут добавлены. Проскролим вниз, чтобы принять наш Pull Request:
![PR Page](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y47wjn21hhlyqb97j2es.png)
5. Внизу мы можем принять наши изменения, отклонить их или написать комментарий. Для принятия наших изменений нажмём *"Merge pull request"*:
![Merge, Close Buttons](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rzf33dub1xa1vhxssy7y.png)
И подтвердим:
![Confirm merge](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s13caajxfep6o02z1mpj.png)

Теперь мы можем перейти на главную страницу репозитория и увидеть наши изменения:
![repo page](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yhct68fea3psfym1qa8f.png)

![code.sh content](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d145ocz6doem5u5owsdj.png)

## Итог

Системы контроля версий являются незаменимым инструментом для всех современных разработчиков. Они обеспечивают безопасность, стабильность и эффективность процесса разработки. Вне зависимости от того, трудитесь ли вы над маленьким проектом один или над крупным проектом в команде, СКВ предоставят вам полезные ресурсы для успешной работы.

В свою очередь, конкретно Git - очень мощный инструмент для управления версиями, который стал стандартом для индустрии. В этой статье мы освоили основные команды и понятия, и теперь вы сможете эффективно управлять своим кодом, а также сотрудничать с другими разработчиками. Впереди, конечно же, вас ждёт ещё множество других возможностей Git, и вы позднее сможете освоить их по необходимости.

## Полезные ссылки

1. **Официальные ресурсы**:
    - [Официальный сайт Git](https://git-scm.com/)
    - [Официальная документация Git](https://git-scm.com/doc)
2. **Обучающие ресурсы**:
    - [Pro Git book](https://git-scm.com/book/en/v2) - бесплатная книга на официальном сайте Git. Она доступна на многих языках и охватывает почти все аспекты работы с Git.
    - [Git How To](https://githowto.com/) - интерактивное руководство для изучения Git.
3. **Вспомогательные инструменты**:
    - [Gitignore.io](https://www.toptal.com/developers/gitignore) - генератор файлов `.gitignore` для различных сред разработки.
    - [Visualizing Git](http://git-school.github.io/visualizing-git/) - интерактивная визуализация для понимания команд Git.
4. **Полезные статьи и руководства**:
    - [A successful Git branching model](https://nvie.com/posts/a-successful-git-branching-model/) - известная модель ветвления от Vincent Driessen.
    - [GitHub Flow](https://docs.github.com/en/get-started/quickstart/github-flow) - понимание процесса ветвления и слияния на GitHub.
    - [Git Tips](https://github.com/git-tips/tips) - сборник полезных советов и трюков по Git.
5. **Курсы и видео**:
    - [Git and GitHub Crash Course](https://www.youtube.com/watch?v=SWYqp7iY_Tc) на YouTube.
    - [Git Essential Training](https://www.linkedin.com/learning/git-essential-training-the-basics) на LinkedIn Learning.
6. **Форумы и сообщества**:
    - [Stack Overflow Git tags](https://stackoverflow.com/questions/tagged/git) - для решения конкретных проблем и вопросов по Git.
    - [Reddit r/git](https://www.reddit.com/r/git/) - сообщество для обсуждения новостей, вопросов и лучших практик, связанных с Git.
    - [dev.to Git tags](https://dev.to/t/git) - другие статьи на dev.to на тему git.

*Обязательно подписывайтесь на мой аккаунт [dev.to](https://dev.to/mainarthur) и Telegram-канал, скоро будет ещё больше контента:* https://t.me/MainArthur