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

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

# Переход в целевой модуль
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'a или IDE.

# Переход в целевой модуль
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'a или IDE.

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

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