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

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

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

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