Sobes.tech
Middle

Ako vykonať prepísanie zmien na hlavnej vetve (main branch)?

sobes.tech AI

Odpoveď od AI

Použite git revert alebo git rebase (v interaktívnom režime alebo git rebase --onto pre zložitejšie scenáre) s následným git push -f.

git revert vytvára nový commit, ktorý zruší zmeny z uvedených commitov. Toto je bezpečnejšia možnosť, pretože sa zachová história.

# Zrušiť posledný commit
git revert HEAD
# Zrušiť konkrétny commit podľa jeho hashu
git revert <commit-hash>
# Zrušiť rozsah commitov (okrem posledného)
git revert <začiatočný-hash>..<koncový-hash>
# Zrušiť rozsah commitov (vrátane oboch)
git revert -n <začiatočný-hash>^..<koncový-hash>
# Zrušiť zmeny, ktoré boli aplikované ako jeden celok bez vytvárania samostatných commitov za každý
ngit revert -n <commit-hash-alebo-rozsah>
# Aplikovať vytvorený commit
git commit -m "Revert changes"

git rebase umožňuje prepísať históriu commitov. Môže byť použitý na odstránenie, zlúčenie alebo zmenu poradia commitov. Vyžaduje opatrnosť, najmä na spoločných vetvách.

# Spustiť interaktívny rebase pre posledných N commitov
git rebase -i HEAD~N
# V otvorenom editore zmeniť 'pick' na 'drop' pri commitoch, ktoré chcete odstrániť.
# Uložiť a zatvoriť súbor.

# Scenár s rebase --onto: presunúť commity A, B, C z vetvy feature na master,
# ignorujúc commit D, ktorý bol na feature.
# Aktuálna vetva feature
# X -- Y -- Z -- D -- A -- B -- C (feature)
#             /
#            W (master)
# Cieľ: X -- Y -- Z -- W -- A -- B -- C (master)
git rebase --onto master D feature
# Kde:
# master - cieľová vetva, na ktorú presúvame
# D - commit, do ktorého vylučujeme presun z pôvodnej vetvy feature
# feature - pôvodná vetva, z ktorej berieme commity na presun

Po použití git revert alebo git rebase na hlavnej vetve bude potrebné nútené odoslanie zmien (git push -f alebo git push --force-with-lease), pretože lokálna história sa odlišuje od vzdialenej.

# Nútené odoslanie po rebase
git push -f origin main
# Bezpečnejšie nútené odoslanie
git push --force-with-lease origin main

Dôležité: Prepisovanie histórie na spoločnej vetve (main) je veľmi neodporúčané, pretože môže narušiť prácu iných vývojárov, ktorí už synchronizovali s predchádzajúcou verziou histórie. Odporúča sa git revert. git rebase na hlavnej vetve by sa mal používať iba vo výnimočných prípadoch a pri úplnej istote o dôsledkoch, zvyčajne po dohode s celým tímom.