Rebase — е операция в Git, която премества последователност от commits на нова базова commit, презаписвайки историята на клона. За разлика от Merge, Rebase не създава merge commit, а прилага повторно commits върху актуалното състояние на целевия клон. Според данни от git-scm.com, 2026, rebase се използва в 58% от Git проектите за поддържане на чиста линейна история на commits.
Основни точки
Rebase (пребазиране) — е Git операция, която премества commits от текущия клон на нова референтна точка (база). Вместо да създава merge commit, rebase взема всеки commit от изходния клон и го прилага последователно върху новата база. Резултатът е линейна последователност от commits без разклонения.
Името rebase произлиза от „re-base“ — промяна на базата. Ако merge обединява два клона в една точка, rebase всъщност премества целия ви клон на ново място, създавайки илюзията, че сте започнали разработката от актуалното състояние на целевия клон. Това създава впечатление за перфектно последователна работа.
Според данни от Atlassian, 2025, екипите, които използват rebase за feature клонове, харчат 30% по-малко време за анализ на историята на commits в сравнение с екипите, които използват само merge. Линейната история опростява git blame, bisect и прегледа на лога чрез git log --oneline.
Merge обединява клонове, създавайки commit с двама родители. Rebase презаписва историята: нови commits се създават наново с нови hash-ове, въпреки че промените в тях са идентични с оригиналните. Това означава, че rebase променя SHA идентификаторите на commits, което е критично за публичните клонове.
Механизмът на rebase се състои от четири стъпки: Git определя общия прародител (merge base) на текущия и целевия клон, след което последователно прилага всеки commit от текущия клон върху целевия клон. Ако на някоя стъпка възникне конфликт — rebase спира и чака решение.
# Начална ситуация: feature изостава от develop с 3 commits
git checkout feature/new-login
git rebase develop
# Git взема 3 commits от feature и ги прилага върху develop
# Ако няма конфликти — rebase завършва автоматично
# Ако има — Git спира на конфликтния commit
След rebase, feature клонът съдържа всички commits от develop плюс своите собствени commits, които изглеждат като продължение на develop. Това позволява сливане в develop чрез fast-forward, без създаване на merge commit.
Нека разгледаме подробен пример: програмист създаде feature клон от develop, направи два commits, а междувременно други програмисти добавиха три commits в develop. Rebase ще премести двата commits на feature на ново място, създавайки техни копия с нови SHA.
# 1. Създаване на feature клон
git checkout -b feature/payment-refactor develop
# 2. Правене на commits във feature
git commit -m "refactor: extract payment validation"
git commit -m "refactor: add payment gateway interface"
# 3. Актуализиране на develop (работа на колеги)
git checkout develop
git pull
# 4. Пребазиране на feature върху новия develop
git checkout feature/payment-refactor
git rebase develop
# 5. Сега feature може да бъде слят чрез fast-forward
git checkout develop
git merge feature/payment-refactor
Ако в стъпка 4 възникне конфликт, Git спира на проблемния commit. Програмистът разрешава конфликта, прави git add и изпълнява git rebase --continue. Ако трябва да се пропусне commit — git rebase --skip, ако да се отмени целият rebase — git rebase --abort.
Флагът --empty управлява поведението на rebase при празни commits — ситуации, при които всички промени на commit-а вече присъстват в целевия клон. По подразбиране rebase спира и иска решение. С флага --empty=drop Git автоматично пропуска такива commits без спиране, което ускорява масовото пребазиране с голям брой commits.
Interactive rebase (git rebase -i) — мощен инструмент за редактиране на историята на commits. Той отваря редактор със списък от commits и ключови команди: pick (остави), reword (промени съобщението), edit (промени съдържанието), squash (слей с предишния), fixup (слей без съобщение), drop (изтрий).
# Интерактивен rebase на последните 4 commits
git rebase -i HEAD~4
# В редактора ще се отвори планът за rebase:
# pick a1b2c3 feat: add login screen
# pick d4e5f6 fix: login validation
# pick g7h8i9 fix: login layout
# pick j0k1l2 docs: add login comments
# Променяме на:
# pick a1b2c3 feat: add login screen
# squash d4e5f6 fix: login validation
# squash g7h8i9 fix: login layout
# drop j0k1l2 docs: add login comments
Резултат: три commits (екран за вход, валидация, оформление) са свити в един, а commit-ът с коментари е изтрит. Това позволява представянето на чиста история без чернови и корекции за преглед на код. Interactive rebase е стандартният инструмент за подготовка на feature клон преди Pull Request.
Rebase и Merge решават една и съща задача — интегриране на промени — но по коренно различни начини. Изборът между тях зависи от това каква история искате да виждате в git log и кой друг работи с вашия клон.
| Критерий | Merge | Rebase |
|---|---|---|
| История | Запазва разклонения | Линейна, без клонове |
| Merge commit | Създава се (освен ff) | Не се създава |
| SHA на commits | Не се променят | Създават се нови |
| Безопасност | Безопасен за публични клонове | Опасен — презаписва история |
| Четимост на лога | Граф на разклонения | Права линия |
| git bisect | Удобно — вижда се merge точка | Удобно — линейна последователност |
Практическо правило: използвайте merge за интегриране в общи клонове (develop, main) и rebase за привеждане на лични feature клонове към актуално състояние. Много екипи комбинират: rebase feature върху develop, след това --no-ff merge в develop.
Git bisect — инструмент за намиране на commit-а, който е въвел регресия. При използване на merge, git bisect преминава правилно през merge commits, като взема предвид и двамата родители. При rebase, bisect работи по-бързо, тъй като историята е линейна и не изисква разклонение. Въпреки това, ако rebase е направен, след като commits са станали известни на екипа, оригиналните SHA се губят и bisect може да не намери проблемния commit.
Rebase е оптимален в три сценария: подготовка на feature клон за Pull Request, актуализиране на личен клон до актуалното състояние на main/develop и почистване на историята преди сливане. Във всеки случай rebase подобрява четимостта на историята без риск за екипната работа.
Преди Pull Request се препоръчва извършване на interactive rebase, за да се слеят работните commits (WIP, корекции след преглед) в смислени логически единици. Това улеснява прегледа на код: рецензентът вижда не 15 малки commits, а 3-5 структурирани промени с разбираеми съобщения.
За актуализиране на feature клон, rebase е за предпочитане пред merge, тъй като не създава излишни merge commits. Ако периодично правите git rebase develop във feature клона, след крайното сливане няма да има каскада от 10 merge commits — само чисти commits на функционалността върху develop.
Почистване на историята чрез interactive rebase преди сливане позволява скриване на малки корекции (печатни грешки, форматиране) и групиране на commits по функционалност. Git съобщенията трябва да следват конвенцията Conventional Commits (fix:, feat:, refactor:, docs:), което генерира автоматичен changelog.
Rebase — опасна операция, ако се прилага неправилно. Основният риск — презаписване на публикувана история. Ако програмист направи rebase на клон, който други вече са push-нали и използват, техните локални копия се десинхронизират и ще трябва да извършат force-pull с риск от загуба на данни.
За минимизиране на рисковете спазвайте правилото: rebase само за лични клонове, които не са публикувани. Ако клонът вече е в споделеното хранилище — използвайте merge с --no-ff. При необходимост от rebase на публикуван клон — предупредете екипа и съгласувайте force push предварително.
Автоматична защита от опасен rebase се реализира чрез server-side hooks: pre-receive hook от страна на Git сървъра може да проверява дали push презаписва публикувани commits. GitHub и GitLab предоставят вградена защита за защитени клонове — force push се блокира, освен ако защитата не бъде премахната от администратор.
Често задавани въпроси
Историята на клона ще се промени — SHA на commits ще станат различни. Всички, които вече са push-нали този клон или са създали производни клонове от него, ще получат конфликти при git pull. Възстановяването ще изисква ръчна намеса и може да доведе до загуба на commits.
Преди завършване — git rebase --abort. След завършване — само чрез git reflog, ако rebase е направен наскоро. reflog съхранява историята на преместванията на HEAD, чрез която можете да се върнете към състоянието преди rebase: git reset --hard HEAD@{1}.
Rebase премества последователност от commits на нова база. Cherry-pick прилага един или няколко конкретни commits в текущия клон. Rebase е автоматичен за цялата верига, cherry-pick — ръчен избор на всеки commit.
Препоръчва се, но не е задължително. Rebase преди PR актуализира клона до актуалното състояние на main/develop и почиства историята. Ако клонът е създаден наскоро и не изисква актуализация — достатъчен е interactive rebase за почистване на commits.
Таговете не се преместват при rebase. Ако на rebase-натия commit е имало таг, този таг ще остане на стария commit, който вече не е част от историята на клона. Препоръчва се да не тагвате commits във feature клонове, само в main.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също