< />

Hotfix na gitu: šta kad usred rada stigne nešto hitno?

Zamislite scenario. Utorak je prepodne, kafa je još topla, a mi smo u zoni. Radimo na grani feature/nova-stranica, otvorili smo osam fajlova, pola koda radi, pola je zakucano // TODO komentarima i ništa od toga nije spremno za commit.

I onda stiže poruka:

"Produkcija ne radi, korisnici ne mogu da se uloguju. Možeš li odmah da pogledaš?"

Prva misao je panika. Druga je: "Kako da ostavim sve ovo ovako i pređem na nešto drugo, a da ništa ne izgubim?"

Dobra vest je da git ima odgovor za to, i to ne jedan nego tri. Prođimo kroz njih.

Prvo, šta ne radimo

Kad nas stisne, lako je da napravimo neku od ovih grešaka:

  • Commit "wip" i push na feature granu, pa neko to slučajno spoji u main.
  • Popravka bug-a na feature grani, jer smo već tu. Tako se hotfix meša sa nedovršenim kodom i ne možemo da ga isporučimo samostalno.
  • Brisanje izmena (git checkout ., git reset --hard) da bi nam git dozvolio da pređemo na drugu granu. Sat vremena rada nestaje u jednoj komandi.

Pravilo je jednostavno: hotfix ide na svoju granu, koja kreće iz main-a, a naš nedovršeni rad ostaje sačuvan negde sa strane.

main         o---o---o---------------o   (hotfix ide ovde)
                      \             /
hotfix/login           o---o---o---o
                \
feature/nova     o---o---o   (ovo ostaje netaknuto)

Opcija 1: git stash (najbrži način)

Zamislite da stavljamo sve što smo radili u fioku i zatvaramo je. Radni folder je opet čist, a izmene čekaju da se vratimo.

git stash push -u -m "nova stranica, pola forme"

Šta znače delovi komande:

  • -m daje stash-u ime, da za dva dana znamo šta je unutra.
  • -u uključuje i nove fajlove koje git još ne prati. Bez toga bi ostali u folderu i mogli bi da nas zbune.

Sad kad je folder čist, pravimo hotfix:

git switch main
git pull
git switch -c hotfix/login-crash

# ... popravimo bug ...

git add .
git commit -m "Popravljen pad pri loginu"
git push -u origin hotfix/login-crash

Kad se hotfix pregleda i spoji u main, vraćamo se na svoj posao:

git switch feature/nova-stranica
git stash pop

I eto nas tačno tamo gde smo stali, sa svih osam otvorenih fajlova i TODO komentarima.

Tip: Ako imamo više stash-eva, git stash list ih prikazuje sve. Pošto smo ih imenovali, odmah znamo koji je koji.

Opcija 2: privremeni WIP commit

Neki ne vole stash, jer deluje kao da stvari nestaju u nekoj magli. Za njih postoji običan commit koji ćemo kasnije "poništiti".

git add -A
git commit -m "WIP: nova stranica"
git switch main

Hotfix radimo isto kao gore. Kad se vratimo na feature granu, uradimo:

git switch feature/nova-stranica
git reset HEAD~1

reset HEAD~1 (bez --hard) skida poslednji commit, ali sve izmene ostavlja u fajlovima. Kao da commit nikad nismo napravili.

Pazimo: ovaj WIP commit nikad ne pushujemo. Ostaje samo kod nas dok ne uradimo reset.

Opcija 3: git worktree (za one koji hoće da imaju sve)

Evo stvari koju mnogi ne znaju da postoji. Šta ako ne želimo da ništa sklanjamo u fioku? Šta ako bismo želeli dva foldera iz istog repozitorijuma, svaki na svojoj grani?

To je git worktree.

git worktree add ../hotfix-login -b hotfix/login-crash main

Ova komanda pravi novi folder ../hotfix-login, u njemu je grana hotfix/login-crash napravljena iz main-a. Naš originalni folder sa feature granom ostaje potpuno netaknut: nedovršeni fajlovi su na svom mestu, a editor otvoren.

Sad otvorimo novi folder u drugom prozoru editora, popravimo bug, napravimo commit i push kao i inače:

cd ../hotfix-login
git add .
git commit -m "Popravljen pad pri loginu"
git push -u origin hotfix/login-crash

Kad je gotovo, uklanjamo folder:

cd ../moj-projekat
git worktree remove ../hotfix-login

Ovo je naročito korisno kad hotfix traje duže, ili kad treba da pokrenemo aplikaciju sa popravkom, a da nam feature ne smeta.

Kad je hotfix gotov, nije gotov

Čest propust: spojimo hotfix u main, odahnemo i zaboravimo na feature granu. Ona sad ne zna za popravku. Zato se vratimo na nju i povučemo najnovije:

git switch feature/nova-stranica
git merge main

Tako kad jednog dana budemo spajali feature u main, neće biti iznenađenja i konflikata, a bug koji smo popravili neće ponovo da se pojavi.

Hotfix granu možemo da obrišemo kad više nije potrebna:

git branch -d hotfix/login-crash

Koju opciju da izaberemo?

  • Stash: kad je hotfix brz, do pola sata. Najmanje komandi.
  • WIP commit: kad volimo da je sve zapisano u istoriji i da ne zavisimo od stash liste.
  • Worktree: kad hotfix traje, kad treba da pokrećemo aplikaciju ili kad ne smemo da dirnemo trenutni folder.

Najbolja navika je grana za svaki zadatak. Kad je tako, hitan zadatak nikad nije katastrofa, samo još jedna grana.

Share :