Примеры рабочих процессов#
Разработка несрочного функционала или исправлений#
Переход в целевой модуль:
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 или IDEA.
Переход в целевой модуль:
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 или 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].
При возникновении конфликтов:
Разрешите его (например, средствами
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
Если смёржить не получилось, то в общую ветку кто-то успел слить свои изменения и необходимо ещё раз выполнить синхронизацию изменений.