„Отмяна“ и „ролбек“ — термини, означаващи връщане на системата, кода или данните към предишно състояние. В разработката това е фундаментална операция, вградена в системите за контрол на версиите, базите данни и механизмите за разгръщане. По данни от Git Documentation, операциите за отмяна биват безопасни (revert със създаване на нов комит) и деструктивни (reset със загуба на история). Разбирането на разликите между тях помага да се избегне загубата на данни при връщане към предишна версия.
Основното
Отмяна (ролбек) — операция за връщане на системата към предишно стабилно състояние. В контекста на разработката това може да означава отмяна на комит в Git, връщане на транзакция в базата данни или връщане на предишна версия на приложението на сървъра. Терминът идва от английското „rollback“ и здраво се е наложил в речника на разработчиците от всички платформи.
Необходимостта от отмяна възниква, когато новото изменение чупи функционалността, предизвиква грешки или не преминава проверката за качество. В добре организирания процес на разработка отмяната не е признак на провал, а стандартна процедура, заложена в работния процес. Колкото по-бързо екипът може да отмени проблемното изменение, толкова по-малко е влиянието на бъга върху потребителите.
Различните инструменти предлагат различни механизми за отмяна: Git дава избор между безопасния revert и деструктивния reset, базите данни поддържат транзакционен rollback, а CI/CD системите могат да превключват трафика между версиите. Изборът на подход зависи от контекста и изискванията за запазване на историята на промените.
Git revert — безопасен начин за отмяна, който създава нов комит, отменящ измененията на предишния. Историята остава линейна, всички стари комити се запазват. Това е единственият правилен избор за отмяна в общ клон, с който работят няколко разработчика. Командата git revert не изтрива историята — тя добавя факта на отмяната като ново изменение.
Git reset премества указателя на текущия клон към указания комит, отхвърляйки всички последващи изменения. В зависимост от флага — soft, mixed или hard — reset обработва работната директория и индекса по различен начин. Режимът hard напълно премахва измененията от историята, което го прави опасен за общите клонове и подходящ само за локална работа.
Revert се прилага в споделени клонове: main, develop, release. Той запазва историята и позволява на другите разработчици да разберат, че изменението е било отменено. След revert можете безопасно да направите git pull — системата няма да даде конфликти, свързани с пренаписаната история. При екипна работа revert е стандартът по подразбиране.
# Отмени последния комит, като създадеш нов комит
git revert HEAD
# Отмени конкретен комит по hash
git revert a1b2c3d
Reset е уместен в локален клон, където още не сте публикували промените. Ако сте експериментирали и искате напълно да почистите историята — reset hard ще го направи. В локален клон можете да използвате reset mixed, за да отмените комитите, но да запазите промените в работната директория за повторен комит.
# Отмени последния комит, запази промените в работната директория
git reset HEAD~1
# Пълна отмяна — промените се премахват окончателно
git reset --hard HEAD~2
Ролбек на транзакцията — операция, която отменя всички промени, направени в рамките на текущата транзакция, и връща базата данни към състоянието от момента на нейното начало. Това гарантира атомарността — един от четирите принципа на ACID (Atomicity, Consistency, Isolation, Durability). Ако на някой етап от транзакцията възникне грешка, се изпълнява rollback и данните се връщат в първоначалното си положение.
Механизмът на rollback се реализира чрез журнал за предварително записване (Write-Ahead Log, WAL). Преди да промени страница с данни, СУБД записва старата и новата стойност в журнала. При rollback системата чете журнала и възстановява първоначалните стойности за всички променени страници. Това гарантира, че дори при прекъсване на захранването транзакцията може да бъде коректно отменена.
BEGIN TRANSACTION;
UPDATE accounts
SET balance = balance - 100
WHERE id = 1;
-- Rollback on error
ROLLBACK;
В дългите транзакции е удобно да се използва savepoint — междинни точки за запис, към които може да се върнете, без да приключвате цялата транзакция. Това позволява да се обработват грешки вътре в сложна операция, без да се губи напредъкът по другите ѝ части. Savepoint се поддържа от повечето релационни СУБД: PostgreSQL, MySQL, Oracle.
SAVEPOINT sp1;
UPDATE orders SET status = 'cancelled'
WHERE id = 42;
ROLLBACK TO sp1;
Отмяна на деплой — връщане на работещото приложение към предишна версия след неуспешно разгръщане. Това е изключително важна възможност за production средата: времето за възстановяване (MTTR) пряко влияе на SLA и потребителското изживяване. Съвременните платформи предлагат няколко стратегии за отмяна в зависимост от архитектурата и изискванията за наличност.
Blue-green — стратегия, при която едновременно работят две идентични среди: blue (текущата версия) и green (новата версия). Трафикът се превключва към green след успешен деплой. Ако новата версия работи неправилно, превключвателят на трафика се връща към blue. Отмяната се изпълнява мигновено, без повторен деплой — достатъчно е да се промени маршрутизацията.
Canary deployment насочва малък дял от трафика към новата версия и следи метриките: брой грешки, време за отговор, процент успешни заявки. Ако метриките се влошат, системата автоматично отменя canary и насочва целия трафик към стабилната версия. Kubernetes и сервизните мрежи (Istio, Linkerd) поддържат тази стратегия изначално.
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 10
strategy:
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
Ще разгледаме три типични сценария, при които на разработчика му се налага да отмени промени. Всеки сценарий изисква свой подход — от проста команда в терминала до многоетапна процедура с участието на CI/CD.
Случайно сте публикували комит с бъг в main. Вашата задача е да отмените промените без загуба на история за екипа. Използвайте git revert, за да създадете отменящ комит, и след това git push. Всички участници в екипа ще видят факта на отмяната и ще могат да продължат работата без конфликти. Това е най-безопасният и прозрачен начин.
git checkout main
git pull origin main
git revert HEAD
git push origin main
Миграцията на базата данни е преминала с грешка и част от данните е повредена. Използвайте транзакционен rollback в миграционния скрипт и възстановяване от резервно копие за вече приложените промени. В добре проектираната система всяка миграция е обвита в транзакция — при грешка СУБД автоматично изпълнява rollback.
След деплоя на новата версия сте открили, че авторизацията не работи. Ако използвате blue-green, отмяната е превключване на router обратно. Ако е rolling update — командата kubectl rollout undo ще върне предишната версия. В идеалния случай процесът на отмяна трябва да бъде автоматизиран и да отнема не повече от минута.
Често задавани въпроси
Revert създава нов комит, който отменя промените, и запазва историята. Reset премества указателя на клона назад и може да изтрие комитите. За общите клонове използвайте само revert.
Ако комитите не са били събрани от garbage collector-а на Git, те могат да бъдат възстановени чрез git reflog. След събиране на боклука обаче възстановяването става невъзможно. Използвайте --hard само в локални клонове.
Rollback отменя всички промени, направени в текущата транзакция, използвайки журнала за предварително записване (WAL). СУБД възстановява първоначалните стойности за всички променени страници с данни.
Savepoint — междинна точка за запис в рамките на транзакцията. Позволява частично връщане към нея, без да се отменя цялата транзакция. Удобен е при дълги операции с множество стъпки.
Конфигурирайте health check и мониторинг на метриките след деплоя. При превишаване на прага на грешките стартирайте автоматична отмяна чрез скрипт или инструмент като Spinnaker, ArgoCD или GitLab Auto Rollback.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също