„Откачивање” и „ролбек” — термини који означавају враћање система, кода или података на претходно стање. У развоју, ово је фундаментална операција уграђена у системе контроле верзија, базе података и механизме имплементације. Према 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
# Поништи одређени комит по хешу
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;
Враћање имплементације — враћање радеће апликације на претходну верзију након неуспешне имплементације. Ово је критично важна могућност за продукционо окружење: време опоравка (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, враћање је пребацивање рутера назад. Ако rolling update — команда kubectl rollout undo ће вратити претходну верзију. У идеалном случају процес враћања треба да буде аутоматизован и да не траје дуже од минута.
Често постављана питања
Revert креира нови комит који поништава измене и чува историју. Reset помера показивач гране уназад и може обрисати комите. За заједничке гране користите само revert.
Ако комити нису сакупљени од стране Git сакупљача отпада, могу се обновити путем git reflog. Међутим, након чишћења, обнављање постаје немогуће. Користите --hard само у локалним гранама.
Rollback поништава све измене направљене у текућој трансакцији користећи дневник претходног уписа (WAL). СУБП обнавља оригиналне вредности за све измењене странице података.
Savepoint — међутачка чувања унутар трансакције. Омогућава делимично враћање на њу без поништавања целе трансакције. Користан у дугим операцијама са више корака.
Подесите health check и праћење метрика након имплементације. При прекорачењу прага грешака покрените аутоматско враћање кроз скрипт или алат попут Spinnaker, ArgoCD или GitLab Auto Rollback.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође