Примеры рабочих процессов#
Разработка несрочного функционала или исправлений#
# Переход в целевой модуль
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"
Внимание
Перед созданием ветки разработки обязательно:
Переключиться на ветку
mainкомандойgit switch.Синхронизировать локальную копию командами
git fetchиgit pull.
После внесения изменений необходимо:
Создать коммиты.
Отправить изменения в удаленный репозиторий через
git push.Сформировать 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"
Внимание
Перед созданием ветки разработки обязательно:
Переключиться на ветку
release.Синхронизировать локальную копию.
После внесения изменений необходимо:
Создать коммиты.
Отправить изменения в удаленный репозиторий.
Сформировать 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>
При возникновении конфликтов:
Разрешите их (например, средствами IDEA).
Создайте 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].
При возникновении конфликтов:
Разрешите его (например, средствами IDEA).
Продолжите копирование командой:
git cherry-pick --continue.Создайте 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
Если смёржить не получилось, то в общую ветку кто-то успел слить свои изменения и необходимо ещё раз выполнить синхронизацию изменений.