# Примеры рабочих процессов

## Разработка несрочного функционала или исправлений

```console
Переход в целевой модуль:
cd gtk

Переключение на основную ветку разработки:
git switch main

Получение актуальных изменений из удаленного репозитория:
git fetch

Синхронизация локальной копии с удаленным репозиторием:
git pull

Создание ветки для нового функционала:
git switch -c "iss/feat/create-any-reference-123123T"

ИЛИ создание ветки для исправления:
git switch -c "iss/fix/bug-in-any-reference-123123T"
```

```{attention}
Перед созданием ветки разработки обязательно:
1. Переключиться на ветку `main` командой `git switch`.
2. Синхронизировать локальную копию командами `git fetch` и `git pull`.
```

После внесения изменений:

1. Создайте коммит.
2. Отправьте изменения в удаленный репозиторий через `git push`.
3. Сформируйте merge request в ветку `main`.

## Экстренные исправления (hotfix) или срочный функционал для релизной ветки

```console
Переход в целевой модуль:
cd gtk

Переключение на стабильную ветку:
git switch release

Получение актуальных изменений из удаленного репозитория:
git fetch

Синхронизация локальной копии с удаленным репозиторием:
git pull

Создание ветки для hotfix:
git switch -c "iss/hotfix/fix-any-reference-123123T"

ИЛИ создание ветки для срочного функционала:
git switch -c "iss/feat/urgent-functionality-123123T"
```

```{attention}
Перед созданием ветки разработки обязательно:
1. Переключиться на ветку `release`.
2. Синхронизировать локальную копию.
```

После внесения изменений необходимо:

1. Создать коммиты.
2. Отправить изменения в удаленный репозиторий.
3. Сформировать merge request в ветку `release`.

### Копирование экстренных исправлений в основную ветку разработки

Для переноса используется команда: `git cherry-pick -x`.

```{attention}
Обязательно используйте параметр `-x`, который добавляет в сообщение коммита строку `cherry picked from commit <hash>`.
```

#### Копирование одиночного коммита

Скопируйте `hash` коммита из `GitLab` или `IDEA`.

```console
Переход в целевой модуль:
cd gtk

Переключение на основную ветку разработки:
git switch main

Получение актуальных изменений из удаленного репозитория:
git fetch

Синхронизация локальной копии с удаленным репозиторием:
git pull

Создание ветки для копирования исправления:
git switch -c "iss/hotfix/cp-functionality-123123T"

Копирование коммита:
git cherry-pick -x <hash>
```

При возникновении конфликтов:

1. Разрешите их (например, средствами `IDEA`).
2. Создайте merge request в ветку `main`.

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

Скопируйте `hash` первого и последнего коммитов из `GitLab` или `IDEA`.

```console
Переход в целевой модуль:
cd gtk

Переключение на основную ветку разработки:
git switch main

Получение актуальных изменений из удаленного репозитория:
git fetch

Синхронизация локальной копии с удаленным репозиторием:
git pull

Создание ветки для копирования исправления:
git switch -c "iss/hotfix/cp-functionality-123123T"

Скопировать коммит:
git cherry-pick -x <start_hash>^..<end_hash>
```

```{attention}
Запись `<start_hash>^..<end_hash>` включает все коммиты в интервале [start_hash; end_hash].

Без символа `^` диапазон становится (start_hash; end_hash].
```

При возникновении конфликтов:

1. Разрешите его (например, средствами `IDEA`).
2. Продолжите копирование командой: `git cherry-pick --continue`.
3. Создайте merge request в ветку `main`.

## Перенос изменений в релизную ветку через rebase

Если ваши изменения попали в основную ветку разработки `main`, но они так же должны переехать в `release`, то не
обязательно использовать команду `cherry-pick`, можно воспользоваться ребейсом.\
Для этого необходимо использовать команду `git rebase`.
Для начала необходимо скопировать коммит, от которого была создана ветка разработки.

```{attention}
Учтите, что при ребейсе в ветке разработки у коммитов будет изменён хэш. Если вы не один используете данную ветку, то у других она сломается.

Если вы сомневаетесь, что сможете сделать правильно, лучше использовать `cherry-pick`.
```

```console
Переход в целевой модуль:
cd gtk

Переключение на основную ветку разработки:
git switch main

Получение актуальных изменений из удаленного репозитория:
git fetch

Синхронизация локальной копии с удаленным репозиторием:
git pull

Переключение на релизную ветку:
git switch release

Получение актуальных изменений из удаленного репозитория:
git fetch

Синхронизация локальной копии с удаленным репозиторием:
git pull

Переключение на ветку с задачей:
git switch feature

Выполнение rebase, где <hash> - коммит, от которого была создана ветка feature:
git rebase --onto release <hash> feature

# При конфликтах:
# 1. Разрешите конфликты
# 2. Продолжите процесс: git rebase --continue

Принудительная отправка изменений (с перезаписью истории):
git push --force-with-lease
```

## Актуализация долгосрочных веток

Если у вас есть ветка `wip/feat/...`, то её необходимо периодически актуализировать. Для этого лучше всего подойдёт
`rebase`, так как он, в отличии от `merge` - не создаёт дополнительные мусорные коммиты с решением конфликтов.

```console
Переход в целевой модуль:
cd gtk

Переключение на ветку с задачей:
git switch wip/feat/task-123123T

Получение актуальных изменений из удаленного репозитория:
git fetch

Синхронизация локальной копии с удаленным репозиторием:
git pull

Ребазирование на актуальную main:
git pull origin main --rebase

Принудительная отправка изменений:
git push --force-with-lease
```

## Организация совместной разработки

При совместной разработке необходимо создать ветку под задачу:

```console
Переход в целевой модуль:
cd gtk

Получение актуальных изменений из удаленного репозитория:
git fetch

Синхронизация локальной копии с удаленным репозиторием:
git pull

Создание ветки под совместную разработку:
git switch -c wip/feat/task-123123T
```

### Создание индивидуальных веток

Каждый разработчик от этой ветки создаёт ветку под свою часть задачи.

```console
Создание ветки под задачу от общей ветки:
git switch -c wip/feat/task-part1-123123T`
```

### Синхронизация изменений

Перед продолжением работы в ветке, её необходимо актуализировать:

```console
Переход в целевой модуль:
cd gtk

Переключение на ветку с задачей:
git switch wip/feat/task-part1-123123T

Синхронизация локальной копии с удаленным репозиторием:
git fetch origin

Ребазирование на актуальную общую ветку разработки:
git rebase wip/feat/task-123123T

Принудительная отправка изменений:
git push --force-with-lease
```

### Интеграция изменений в основную ветку

```console
Переход в целевой модуль:
cd gtk

Переключение на общую ветку с задачей:
git switch wip/feat/task-123123T

Получение актуальных изменений из удаленного репозитория:
git fetch

Синхронизация локальной копии с удаленным репозиторием:
git pull

Попытка смержить свою ветку (при конфликтах merge - не пройдёт):
git merge --ff-only wip/feat/task-part1-123123T
```

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