Как подлить изменения из ветки develop в feature-ветку с помощью rebase или merge, чтобы получить merge request только с вашими изменениями
Что проверяют
Понимаете ли вы, как считается дифф merge request, и умеете ли чинить ветку, в которую попали чужие коммиты. Следом обычно спрашивают, когда rebase делать нельзя и чем --force-with-lease лучше --force.
Как отвечать
Начните с факта: дифф MR строится от общей базы (merge-base) вашей ветки и целевой. Поэтому и merge, и rebase свежего develop оставляют в диффе только ваши изменения, а разница в истории:
- merge:
git fetch origin, затемgit merge origin/develop. История не переписывается, пуш обычный, но в списке коммитов появляется merge-коммит. Подходит для общей ветки; - rebase:
git fetch origin, затемgit rebase origin/developиgit push --force-with-lease. Ваши коммиты встают поверх develop, история линейная. Если в репозитории включён fast-forward merge, без этого шага MR не влить; - чистка перед ревью:
git rebase -i origin/developсклеивает правки вида «fix typo», аgit commit --fixupплюсgit rebase -i --autosquashделают это сами; - ветка от чужой ветки: если feature создали от другой feature или от устаревшего коммита, в MR поедут чужие коммиты. Лечится
git rebase --onto origin/develop old-base my-feature: переносятся только коммиты после old-base.
Для Python-проекта назовите типичные конфликты. Lock-файлы poetry.lock и uv.lock руками не сливают: берут версию из develop и заново выполняют poetry lock или uv lock. Миграции Alembic после слияния дают две головы, это видно по alembic heads, и решается alembic merge или правкой down_revision у своей миграции.
Где спотыкаются
Делают git push --force после rebase. Если коллега успел запушить в ту же ветку, его коммиты молча пропадут. --force-with-lease откажет, если удалённая ветка изменилась с момента вашего последнего fetch, а --force-if-includes страхует и от фонового fetch в IDE.
Ребейзят ветку, которой пользуются другие. У остальных история разъезжается, и при следующем git pull появляются дубли коммитов.
Путают git pull с обновлением от develop. Без аргументов он подтягивает ту же ветку с сервера, а develop в вашей ветке остаётся старым. Нужны явные git fetch и слияние с origin/develop.