svn – jak cofnąć zmiany wykonane w kopii roboczej i już zacommitowane?

Jeśli pracujemy w oparciu o system kontroli wersji Subversion (SVN) Czasem zachodzi potrzeba cofnięcia zmian wykonanych przez nas w projekcie. Zazwyczaj w tym celu służy komenda:


Aby uwzglęnić także pliki ukryte (np. w nazwie rozpoczynające się porzez kropkę “.”) użyjmy takiej komendy:


Cofa wszystkie zmiany wykonane w plikach i przywraca ich do wartości domyślnej. Dodatkowo po wywołaniu wówczas:


Aktualizujemy naszą kopię roboczą do najnowszej wersji. Np. jeśli nasi koledzy w zespole w tym czasie nanieśli zmiany w aplikacji.

Co natomiast w przypadku, gdy poczyniliśmy zmiany w kodzie naszej aplikacji i dodatkowo wykonaliśmy commit tych zmian. I to nie jeden. Jednak te modyfikacje okazały się zbędne i jesteśmy zmuszeni je cofnąć. Jak w takim wypadku przywrócić zmiany do wersji sprzed naszej ingerencji? Posłużymy się tutaj funkcją merge.

Na początek musimy mieć pewność, że żadne pliki w naszej kopii nie czekają na commit i nie są zmodyfikowane. Sprawdzamy to za pomocą komendy:


Jeśli komenda pokazuje pliki usunięte (oznaczenie D) lub zmienione (oznaczenie M) cofamy je przez wyżej pokazaną komendę:


OK. Mamy “czystą” kopię roboczą. Teraz upewnijmy się że mamy ją aktualną. Wywołajmy:


I zanotujmy aktualną rewizję naszej kopii roboczej. Czyli numer:


Jeśli nowe pliki się pojawiły przytępujemy do działania. Najpierw poprzez komendę:


Sprawdźmy historię naszych zmian. Klawiszamy page up i page down ustalmy od której rewizji chcemy przywrócenia zmian. Oczywiście oznaczonych przez naszego użytkownika. Zanotujmy ten numer. Powiedzmy jest to:


Następnie wychodzimy z listingu zmian poprzez kombinację klawiszy


Wywołujemy następnie komendę wg wzorca:


Czyli w naszym przypadku:


Następnie pliki są zmieniane wstecz. Tzn wszystkie poczynione zmiany przez nas (i przez innych!) są cofane, a pliki zmieniane. Jeśli w obrębie tego zakresu doszły nowe pliki do repozytorium – są one usuwane.

Możemy to następnie sprawdzimy naszą kopię roboczą poprzez komendę:


Widzimy oznaczenia plików zmienionych (M) i usuniętych (D).

Kolejną rzeczą którą musimy zrobić to sprawdzenie wszystkich plików po kolei. Oczywiście kiedy pracujemy w zespole i inne osoby mogły nanieść zmiany w plikach który nie możemy cofnąć. Niestety. Musimy po prostu uwzględnić te zmany aby one nie przepadły. Jeśli tylko my wykonaliśmy commit albo jesteśmy jedynymi użytkownikami repozytorium – nie musimy tego robić.

Kiedy już jesteśmy pewni, że stan plików odpowiada temu z przed naszych moduyfikacji mozemy zacommitować nasze zmiany:


Gotowe – mamy wersję plików przed naszych zmian. Oczywiście mimo, że jest ona taka sama jak tamta rewizjauzyskuje kolejny nowy numer w repozytorium.