> For the complete documentation index, see [llms.txt](https://timosii.gitbook.io/py_tutorial/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://timosii.gitbook.io/py_tutorial/sistemy-kontrolya-versii/vvedenie-v-git.md).

# Введение в Git

Системы контроля версий представляют собой программные средства, которые регистрируют все изменения в исходном коде и позволяют легко восстановить старые версии.

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

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

Вы можете сравнивать, анализировать, редактировать, сливать изменения и возвращаться назад к последнему сохранению. Этот процесс называется ***контролем версий***.

**Git** — самое популярное приложение контроля версий.

### Как устроен Git

* Вы работаете над проектом. В любой момент вы можете сохранить "снимок" (snapshot) вашего проекта. И работать дальше
* В любой момент вы можете "откатиться" назад — вернуться к любому из "снимков"

<figure><img src="https://1822329473-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fht6R7IOuWvAQ9gEYvkFW%2Fuploads%2Fn1dcZCfkhQXSXHGenzNd%2Fimage.png?alt=media&amp;token=3bf6b92d-b5d4-4f3f-9a90-91e39c0f5f32" alt=""><figcaption><p>Хранение данных как снимков проекта во времени</p></figcaption></figure>

* Если вы работаете над проектом не один — ваши коллеги также могут работать над проектом, реализуя другие фичи. И никто не будет мешать друг другу. Это возможно благодаря концепции "веток" (бранчей) — каждый может работать в своей ветке, а потом слить всё в одну.

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

Скачайте GIT по ссылке: <https://git-scm.com/downloads><br>

### Использование

Если вы работаете на Windows, то после установки увидите программы:

* GIT GUI — приложение с графическим интерфейсом
* GIT Bash — командная оболочка для управления Git. Даже если вы планируете всегда работать из GUI, знать основные команды необходимо.&#x20;
  * В будущем возможно вы будете работать под Linux, для которого нет графического приложения.&#x20;
  * Работа с командной строкой для любого разработчика — это полезный навык.
  * Даже с GUI часть команд нужно вводить через консоль

1. Создайте каталог для вашего проекта.&#x20;
2. Запустите программу GIT Bash. Перейдите в папку с проектом.&#x20;
3. Настройте git, введя в консоль следующие команды (исправьте на своё имя и почту):&#x20;

```
git config --global user.name "My Name"
git config --global user.email myEmail@example.com
```

4. Введите команду `git init` для создания нового репозитория
5. Репозиторий создан. Теперь состояние вашего проекта отслеживается и доступна история изменений. Убедиться в этом можно при помощи команды `git status`

***Практика:***

* Установите GIT на компьютер, создайте репозиторий.&#x20;
* Создайте файл "hello.txt" в своём репозитории, добавьте любой текст

### Основные команды

`git add <filename>` — добавить файл в "отслеживаемые", то есть подготовить к коммиту

`git add .` — подготовить к коммиту сразу все файлы репозитория (точка важна!)

`git reset <имя_файла>` — убрать файл из "отслеживаемых"

`git commit -m <сообщение коммита>` — сделать коммит

`git status` — посмотреть статус файлов

`git log` — посмотреть коммиты

`git show <hash_commit>` — посмотреть информацию о коммите, здесь хэш коммита - его идентификационный номер

`git commit --amend -m 'Новый комментарий'` — перезаписать сообщение последнего коммита

`git revert <hash_commit>` — вернуться на состояние до указанного коммита

### Удаленный репозиторий

* Чтобы поделиться кодом, он должен где-то храниться
* Для этого существуют удаленные репозитории и сервисы для их хранения
* Один из примеров таких сервисов это **GitHub**

***Практика:***

* Зарегистрируйтесь на GitHub

Теперь вы можете склонировать себе любой репозиторий, который там есть. Для этого введите команду:&#x20;

`git clone <ссылка_на_проект>` Обратите внимание, каталог с репозиторием будет создан в рабочей директории.

Для подключения своего, локального репозитория к удаленному, введите команду:

`git remote add origin <ссылка на удаленный репозиторий>`

Для этого удаленный репозиторий должен быть создан. То есть перед этим создайте репозиторий на GitHub.

Ещё пару команд:

`git push origin master` — запушить изменения в ветку "master" в удаленный репозиторий "origin". Часто главная ветка называется "main".

`git pull origin master` — стянуть себе изменения из удаленного репозитория

### Работа с ветками

Ветка — независимая последовательности коммитов в хронологическом порядке

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

```git
# создание ветки
$ git branch <name of new branch>
# переключение на ветку
$ git checkout <name of branch>
# создаем ветку и сразу в нее переключаемся:
$ git checkout branch <name of new branch> 
# посмотреть, какие ветки есть
$ git branch
# переименовать ветку
$ git branch -m <new name of branch>
# удалить ветку
$ git branch -d <name of branch>
# удалить ветку даже с несохраненными изменениями
$ git branch -D <name of branch>
```

#### Слияние

```git
$ git merge <name of merged branch>
```

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

Также стоит упомянуть о существовании ключей, предназначенных специально для работы с конфликтами:

* **—abort** — прерывает слияние и возвращает все к началу
* **—continue** — продолжает слияние после разрешения конфликта

Решить конфликт можно двумя способами:

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

#### Git Flow

* Git Flow — стандарт работы с Git, который устанавливается в крупных компаниях и для совместной работы над крупным проектом

<figure><img src="https://1822329473-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fht6R7IOuWvAQ9gEYvkFW%2Fuploads%2FP9huZIq0fpxmTJQOkIpY%2Fimage.png?alt=media&amp;token=d3e90ac0-465b-406d-a9b1-541a4e4390c0" alt=""><figcaption><p>Один из примеров Git Flow</p></figcaption></figure>

#### *Материалы для изучения:*

* Книга ProGit на русском: <https://git-scm.com/book/ru/v2>
