10 Minutowy Przewodnik Po Podstawach GITa #5 – Praca Na Zmianach – część 2

Tę część przewodnika można potraktować jako rozwinięci przewodnika o pracach na zmianach i o ile poprzednia dotyczyła zapisywania i tworzenia, o tyle ta będzie dotyczyła wycofywania i rezygnacji ze zmian. 

Przyglądnijmy się naszemu repozytorium. Znajduje się w nim pięć plików: hello.sql, clients.sql, products.sql, address.sql, .gitignore i pięć zmian (Na potrzeby tego programu dodałem jedną zmianę do pliku hello.sql i utworzyłem plik address.sql, zrób to i Ty). Pamiętasz, plik tmp.txt, nie wliczam go, bo nie jest częścią projektu.

Zawartość projektu
CHECKOUT

Na potrzeby tej części poradnika chcemy wycofać ostatnią modyfikację pliku hello.sql. W tym celu chcemy przenieść się do miejsca, w którym tej zmiany nie ma. Kopiujemy hash zmiany, do której chcemy się cofnąć (w moim przypadku jest to 34c324e) i wykonujemy polecenie git checkout

Wycofanie zmiany poleceniem checkout

I stało się. Zmiany w pliku hello.sql zostały wycofane. Zwróć uwagę, że pliku address.sql, który został dodany później również nie ma. To dlatego, że cofnęliśmy się do miejsca, w którym tych zmian jeszcze nie było. Ważną informacją jest również to, że teraz znajdujemy się w tzw. odłączonej głowie (detached HEAD). Jest to informacja, że znajdujemy się w miejscu poza główną gałęzią (master) i możemy nanosić zmiany bez obawy o popsucie plików w głównej gałęzi. Sprawdźmy to poleceniem git status i git log .

Stan repozytorium po checkout

Z miejsca, w którym aktualnie się znajdujemy w repozytorium możemy utworzyć gałąź (branch), nanieść odpowiednie zmiany i połączyć (merge) z gałęzią główną (master). O tym wszystkim będzie później w kolejnej części przewodnika. Teraz jednak na potrzeby kolejnego polecenia wrócimy do głównej gałęzi poleceniem git checkout master

Powrót do głównej gałęzi (master)
REVERT

Jak widzimy wszystko wróciło do miejsca, od którego zaczęliśmy tą część programu. Ta sama sytuacja, inne polecenie. Poleceniem git revert usuńmy zmiany w pliku hello.sql, ale nie będziemy się cofać do commit’a sprzed modyfikacji pliku tylko bezpośrednio do commit’a w którym dodaliśmy modyfikację (w. moim przypadku jest to 1d85001).

Status repo po poleceniu revert

W logach repozytorium widać, że polecenie git revert nie usunęło nam pliku address.sql, a tylko wycofało zmianę w pliku hello.sql i zrobiło commit, bez ingerencji w historię zmian. Tzn, że ostatnią zmianę zrobiliśmy tylko w nowo powstałym commicie, nie pozbywając się z repozytorium wszystkich wcześniejszych zmian.

RESET

Aby omówić kolejne polecenie przyjmijmy, że mamy kaprys usunięcia ostatniego commita, tak aby nie było po nim śladu, co w naszym przypadku oznaczałoby usunięcia reverta. Zrobimy to właśnie poleceniem git reset --hard. Cofniemy się do miejsca, które jest przez nas porządane czyli fb9221c. A tak będzie wyglądać nasze repozytorium po tym zabiegu. Widzimy, że wróciliśmy do początku tego przewodnika.

Wycofanie zmian poleceniem reset i powrót do początku
Podsumowując

Polecenie git checkout wykorzystujemy wszędzie tam, gdzie chcemy cofnąć się do commita, zbudować gałąź (branch) i równolegle z gałęzią master prowadzić pracę. Polecenie ma to do siebie, że źle poprowadzone może narobić niezłego bałaganu i wycofać zmiany, które były wprowadzone później.

Polecenie git revert jest dużo bezpieczniejsze niż poprzednie, ponieważ nie usuwa późniejszych zmian i nie ingeruje w historię zmian. Zmiany realizowane są na głównej gałęzi master i kończone są commitem.

Dzięki poleceniu git reset możemy całkowicie wycofać zmiany nie tylko z plików projektu, ale również z historii zmian w repozytorium. Choć polecenie to przyjmuje trzy parametry –hard, –soft, –mixed, z którymi polecę Cię zapoznać, to korzystanie z tego polecenia musi być bardzo świadome i przemyślane.

Szymon

Komentarze |0|

Legenda *) Pola oznaczone gwiazdką są wymagane
**) Możesz używać tych znaczników i atrybutów HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Kategoria: Narzędzia
Tagi: ,