Jak provést přepsání změn na hlavní větvi (main branch)?
sobes.tech AI
Odpověď od AI
Použijte git revert nebo git rebase (v interaktivním režimu nebo git rebase --onto pro složitější scénáře) a poté git push -f.
git revert vytvoří nový commit, který vrátí změny z určených commitů. Je to bezpečnější varianta, protože zachovává historii.
# Vrátit poslední commit
git revert HEAD
# Vrátit konkrétní commit podle jeho hashe
git revert <commit-hash>
# Vrátit rozsah commitů (kromě posledního)
git revert <počáteční-hash>..<konečný-hash>
# Vrátit rozsah commitů (včetně obou)
git revert -n <počáteční-hash>^..<konečný-hash>
# Aplikovat změny v jednom kroku bez vytváření samostatných commitů
git revert -n <commit-hash-nebo-rozsah>
# Použít vytvořený commit
git commit -m "Revert changes"
git rebase umožňuje přepsat historii commitů. Může být použit k odstranění, sloučení nebo změně pořadí commitů. Vyžaduje opatrnost, zejména na sdílených větvích.
# Spustit interaktivní rebase pro posledních N commitů
git rebase -i HEAD~N
# V otevřeném editoru změňte 'pick' na 'drop' u commitů, které chcete odstranit.
# Uložte a zavřete soubor.
# Scénář s rebase --onto: přesunout commity A, B, C z větve feature na master,
# přeskočit commit D, který byl na feature.
# Aktuální větev: feature
# X -- Y -- Z -- D -- A -- B -- C (feature)
# /
# W (master)
# Cíl: X -- Y -- Z -- W -- A -- B -- C (master)
git rebase --onto master D feature
# Kde:
# master - cílová větev, kam přesouváme
# D - commit, do kterého přeskočíme přesun na zdrojové větvi
# feature - zdrojová větev, ze které bereme commity k přesunu
Po použití git revert nebo git rebase na hlavní větvi je nutné vynutit push (git push -f nebo git push --force-with-lease), protože lokální historie se odlišila od vzdálené.
# Vynucený push po rebase
git push -f origin main
# Bezpečnější vynucený push
git push --force-with-lease origin main
Důležité: Přepisování historie na sdílené větvi (main) se důrazně nedoporučuje, protože může narušit práci ostatních vývojářů, kteří již synchronizovali s předchozí verzí historie. Upřednostňuje se použití git revert. git rebase na hlavní větvi by měl být použit pouze ve výjimečných případech a s plným vědomím důsledků, obvykle po dohodě s celým týmem.