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:

svn revert * -R

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

svn st | grep -e '^M' | awk '{print $2}' | xargs svn revert

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

svn up

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:

svn st

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

svn st | grep -e '^M' | awk '{print $2}' | xargs svn revert

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

svn up

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

W wersji 57149.

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

svn log | less

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:

57140

Następnie wychodzimy z listingu zmian poprzez kombinację klawiszy

CTRL + Z

Wywołujemy następnie komendę wg wzorca:

svn merge -r{WYŻSZY-NUMER-REWIZJI}:{NIŻSZY-NUMER-REWIZJI} .

Czyli w naszym przypadku:

svn merge -r57149:57140 .

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ę:

svn st

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:

svn ci -m 'cofnięcie zmian do stanu rewizji 57140'

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

Możesz również polubić…

Inna porada:
Podczas pracy z SVN natrafić możemy podczas commitu na dość…