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:
1 |
svn revert * -R |
Aby uwzglęnić także pliki ukryte (np. w nazwie rozpoczynające się porzez kropkę „.”) użyjmy takiej komendy:
1 |
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:
1 |
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:
1 |
svn st |
Jeśli komenda pokazuje pliki usunięte (oznaczenie D) lub zmienione (oznaczenie M) cofamy je przez wyżej pokazaną komendę:
1 |
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:
1 |
svn up |
I zanotujmy aktualną rewizję naszej kopii roboczej. Czyli numer:
1 |
W wersji 57149. |
Jeśli nowe pliki się pojawiły przytępujemy do działania. Najpierw poprzez komendę:
1 |
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:
1 |
57140 |
Następnie wychodzimy z listingu zmian poprzez kombinację klawiszy
1 |
CTRL + Z |
Wywołujemy następnie komendę wg wzorca:
1 |
svn merge -r{WYŻSZY-NUMER-REWIZJI}:{NIŻSZY-NUMER-REWIZJI} . |
Czyli w naszym przypadku:
1 |
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ę:
1 |
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:
1 |
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 rewizja – uzyskuje kolejny nowy numer w repozytorium.