Sobes.tech
Middle

Kako izvršiti prepisivanje promena na glavnoj grani (main branch)?

sobes.tech АИ

Одговор од АИ

Koristite git revert ili git rebase (u interaktivnom režimu ili git rebase --onto za složenije scenarije) sa naknadnim git push -f.

git revert kreira novi commit koji poništava promene iz navedenih commitova. Ovo je sigurnija opcija jer čuva istoriju.

# Poništavanje poslednjeg commita
git revert HEAD
# Poništavanje određenog commita po njegovom hashu
git revert <commit-hash>
# Poništavanje opsega commitova (bez poslednjeg)
git revert <početni-hash>..<krajnji-hash>
# Poništavanje opsega commitova (uključujući oba)
git revert -n <početni-hash>^..<krajnji-hash>
# Poništavanje promena primenjenih kao jedna celina bez kreiranja zasebnih commitova za svaku
ngit revert -n <commit-hash-ili-opseg>
# Primena kreiranog commita
git commit -m "Revert changes"

git rebase omogućava da prepišete istoriju commitova. Može se koristiti za brisanje, spajanje ili promenu reda commitova. Zahteva oprez, posebno na zajedničkim granama.

# Pokretanje interaktivnog rebase-a za poslednjih N commitova
git rebase -i HEAD~N
# U otvorenom uređivaču zamenite 'pick' sa 'drop' pored commitova koje želite da uklonite.
# Sačuvajte i zatvorite fajl.

# Scenarijo sa rebase --onto: premestiti commitove A, B, C sa grane feature na master,
# ignorišući commit D koji je bio na feature.
# Trenutna grana feature
# X -- Y -- Z -- D -- A -- B -- C (feature)
#             /
#            W (master)
# Cilj: X -- Y -- Z -- W -- A -- B -- C (master)
git rebase --onto master D feature
# Gde:
# master - ciljna grana na koju premještamo
# D - commit do kojeg isključujemo premještanje sa izvornog feature-a
# feature - izvornа grana sa koje preuzimamo commitove za premještanje

Nakon primene git revert ili git rebase na glavnoj grani, biće potrebno primorano slanje promena (git push -f ili git push --force-with-lease), jer se lokalna istorija razlikuje od udaljene.

# Prisilno slanje nakon rebase
git push -f origin main
# Bezbednije prisilno slanje
git push --force-with-lease origin main

Važno: Prepisivanje istorije na zajedničkoj grani (main) je veoma nepoželjno, jer može narušiti rad drugih developera koji su već sinhronizovani sa prethodnom verzijom istorije. Preporučuje se git revert. git rebase na glavnoj grani treba koristiti samo u izuzetnim slučajevima i uz potpunu sigurnost u posledice, obično nakon dogovora sa celim timom.