git revert to bezpieczny sposób na cofnięcie zmian w historii Gita. Zamiast wymazywać commit (czym zajmuje się git reset), tworzy nowy commit, który wprowadza dokładnie odwrotne zmiany niż ten, który wskazałeś. Dzięki temu historia zostaje nienaruszona i nadal masz ślad, że coś się działo — co jest złotym standardem na gałęziach współdzielonych, gdzie przepisywanie historii wkurzyłoby resztę zespołu (i połamało im git pull).
Składnia i najważniejsze opcje
Podstawowa składnia: git revert [opcje]
--no-edit— nie otwiera edytora, używa automatycznie wygenerowanego opisu commita.-e,--edit— otwiera edytor, żebyś dopisał własny opis (domyślne zachowanie w trybie interaktywnym).-n,--no-commit— nanosi odwrotne zmiany do indeksu i katalogu roboczego, ale nie tworzy commita. Sam decydujesz, kiedy zatwierdzić.-m,--mainline— wymagane przy cofaniu commita scalającego (merge); wskazuje, którego rodzica traktować jako linię główną.-s,--signoff— dodaje linięSigned-off-bydo opisu.--continue— wznawia operację po rozwiązaniu konfliktów.--abort— przerywa cały proces i wraca do stanu sprzedrevert.--skip— pomija bieżący commit przy cofaniu wielu naraz.
Przykłady użycia
git revert HEAD— cofa ostatni commit, tworząc nowy z odwrotnymi zmianami (otworzy edytor opisu).git revert --no-edit a1b2c3d— cofa konkretny commit po jego skrócie i od razu zatwierdza bez pytania o opis.git revert -n HEAD~3..HEAD— cofa ostatnie trzy commity, ale zbiera je do indeksu bez commitowania — zatwierdzisz je jednym ruchem przezgit commit.git revert -m 1— cofa commit scalający, traktując pierwszego rodzica (gałąź docelową) jako linię główną.git revert --abort— ratunek, gdy w trakcie pojawiły się konflikty i chcesz wycofać się z całej operacji.
Częste błędy i pułapki
Merge commit bez -m. Próba git revert bez podania linii głównej skończy się błędem „commit is a merge but no -m option was given”. Git nie zgadnie, którego rodzica masz na myśli — musisz wskazać numer.
Revert to nie reset. Jeśli liczyłeś, że historia zniknie, to git revert Cię rozczaruje — on dokłada commit, a nie kasuje. Do lokalnego przepisywania historii służy git reset, ale tego nie rób na gałęzi, którą ktoś już pobrał.
Konflikty się zdarzają. Jeśli późniejsze commity dotykały tych samych linii, cofanie może wywołać konflikt. Rozwiąż go, dodaj pliki przez git add i wpisz git revert --continue — albo wycofaj się przez --abort.
Brudny katalog roboczy. Git odmówi startu, jeśli masz niezacommitowane zmiany kolidujące z operacją. Najpierw zrób porządek przez git stash albo commit.
Powiązane komendy: git reset, git checkout, git restore, git log, git cherry-pick, git stash.