Sobes.tech
Middle

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.