Перейти к основному содержанию
`Ctrl`+`K`

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

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

    Переход в целевой модуль:
    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"

Внимание

Перед созданием ветки разработки обязательно:

1. Переключиться на ветку `main` командой `git switch`.

2. Синхронизировать локальную копию командами `git fetch` и `git pull`.

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

1. Создайте коммит.

2. Отправьте изменения в удаленный репозиторий через `git push`.

3. Сформируйте merge request в ветку `main`.

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

    Переход в целевой модуль:
    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"

Внимание

Перед созданием ветки разработки обязательно:

1. Переключиться на ветку `release`.

2. Синхронизировать локальную копию.

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

1. Создать коммиты.

2. Отправить изменения в удаленный репозиторий.

3. Сформировать merge request в ветку `release`.

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

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

Внимание

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

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

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

    Переход в целевой модуль:
    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`.

    Переход в целевой модуль:
    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>

Внимание

Запись `<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`. Для начала необходимо скопировать коммит, от которого была создана ветка разработки.

Внимание

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

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

    Переход в целевой модуль:
    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` - не создаёт дополнительные мусорные коммиты с решением конфликтов.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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