System Kontroli Wersji
8 godz. 23 min · Git · Full-stack i Programowanie
Mateusz KuleszaSenior Software Developer, Konsultant, TrenerInne systemy wersjonowania wymagają konfiguracji specjalnych serwerów - a z GIT wystarczy do tego twój komputer. GIT pozwoli Ci zapisywać kolejne wersje twojej pracy lub eksperymentować z różnymi zmianami. Jeśli chcesz tworzyć kopie zapasowe - w kursie zobaczysz jak tworzyć klony twojego projektu oraz jak wysyłać i pobierać aktualne zmiany pomiędzy klonami.Pierwsza sekcja pozwoli Ci zyskać pewność w samodzielnej pracy z GITem nim podejmiesz się pracy w zespole. Dowiesz się jak przygotować zestaw zmian, ignorować pliki tymczasowe, jak tworzyć migawki z opisami zmian, a następnie przeglądać i porównywać zmiany dokonane nawet miesiące temu. W kolejnej części kursu dowiesz się jak wycofywać zmiany, przywracać wcześniejsze wersje i edytować historię zmian. Zobaczysz, że w GIT “nic nie ginie”. Pokażę Ci jak możesz odzyskać pozornie utracone zmiany oraz jak naprawić historię zmian łącząc, dzieląc, a nawet zmieniając kolejność dokonanych wcześniej zmian.
Jesteś w trakcie pracy nad ważnym projektem, i nagle musisz oderwać się od pracy, by wykonać jedną, szybką poprawkę? W GIT możesz błyskawicznie przełączyć się na inną wersje projektu, lub po prostu “odłożyć na później” pliki nad którymi pracujesz i wrócić do nich kiedy tylko tego potrzebujesz. W tej części kursu zobaczysz jak pracować na gałęziach, dodawać etykiety oraz przełączać różne wersje plików. Dowiesz się jak porównywać oraz eksperymentować z plikami bez ryzyka utraty danych. Co najważniejsze - nauczysz się łączyć i dzielić wiele różnych wersji twojej pracy. Zobaczysz, jak praca na gałęziach nie tylko zwiększy Twoją swobodę i elastyczność w codziennej pracy, ale również jak gałęzie pozwalają wielu osobom na równoległą pracę na tych samych plikach bez martwienia się o utratę danych lub niespójne wersje.
W kursie dowiesz się nie tylko jak zapamiętywać zmiany, ale także jak je opisywać i oznaczać, tak, by nawet miesiące później móc łatwo odnaleźć odpowiednią wersję pliku, lub by dowiedzieć się kiedy, kto i dlaczego zmieniał dany plik. Zobaczysz jak dobre praktyki w opisywaniu zmian wspomagają pracę grupową. Dowiesz się jak pobrać lub wysłać zestaw zmian na serwer oraz jak połączyć zmiany swoje, lub zmiany otrzymane od współpracownika. Dodatkowo, zobaczysz jak bezpiecznie rozwiązać problem konfllktujących zmian w plikach lub jak przenieść zmiany z wersji do wersji. W kursie dowiesz się także jak w bardzo prosty sposób korzystać z pozornie najtrudniejszej funkcji GITa, jaką jest polecenie “rebase”. Zobaczysz jak usprawni się Twoja praca, gdy będziesz mógł w jednym kroku zbudować historię zmian. Jeśli źle zapisałeś zmiany, nie podoba Ci się historia zmian, lub po prostu chciałbyś łatwo uniknąć konfliktów - git rebase będzie Twoim nowym ulubionym narzędziem.
…zmieniło ten sam plik, trzeba jakoś te zmiany połączyć. Zobaczysz jak GIT pozwala wysłać zestaw zmian na serwer, pobrać zmiany innych osób i automatycznie dołączyć te zmiany w odpowiednich miejscach. Co jednak jeśli dwie osoby zmienią tę samą linię w pliku? W kursie dowiesz się nie tylko jakie są różne sposoby i strategie łączenia zmian, ale także jak dzięki historii będziesz wiedział dlaczego zmiana w pliku została wprowadzona. Dzięki narzędziu rebase będziesz mógł zaaplikować wszystkie zmiany w odpowiedniej kolejności i w odpowiednim miejscu.
W kursie poznasz także usługę GitHub. GitHub to nie tylko usługa udostępniająca repozytoria dla GIT - umożliwia również tzw. społecznościowe podejście do tworzenia… I to nie tylko kodu. Zobaczysz, że dzięki GitHub praca nad kodem aplikacji czy nową książką może odbywać się zespołowo. Pokażemy Ci jak publikować swoje zmiany oraz jak zgłaszać je innym do przejrzenia i połączenia z ich wersją. Poznasz także sposoby planowania pracy, przydzielania zadań i zarządzania postępem ich wykonania - wszystko na twoim koncie na portalu GitHub. Oprócz poleceń i funkcji GIT w tym kursie pokażemy Ci również, na prostych, praktycznych przykładach, typowe techniki i praktyki pracy z GIT. Podczas kursu symulujemy zespół budujący prostą stronę internetową. Co ważne, nie musisz znać HTML by skorzystać z tej części kursu! Zobaczysz jak wygląda praca z perspektywy jednej osoby, co zrobić gdy musisz przerwać pracę i przełączyć się na inne zadanie oraz jak przygotować Twoją pracę do podzielenia się nią z zespołem. Pokażemy kilka przykładów organizacji pracy. Zobaczysz prace z małym, centralnym repozytorium, a także modele pracy rozproszonej, z której korzystają duże projekty typu open-source. GIT to branżowy standard, który obowiązuje praktycznie we wszystkich firmach zajmujących się tworzeniem aplikacji lub stron internetowych. Sprawia to, że wiedza, którą zdobędziesz po przerobieniu tego kursu, bezpośrednio przełoży się na efektywność Twojej pracy oraz projekty, które tworzysz.
Kurs przygotowany został z myślą o wszystkich, którzy chcą nauczyć się najbardziej popularnego i elastycznego systemu kontroli wersji i wykorzystać go do efektywnej pracy w zespole, jak i na potrzeby indywidualnych projektów. Jest również przeznaczony dla każdego, kto pracuje z kodem źródłowym i chciałby nie tylko tego, by jego zmiany były bezpieczne, ale by jednocześnie mieć swobodę pracy na kilku równoległych wersjach kodu oraz móc swobodnie eksperymentować nie bojąc się o utratę danych. Jeśli chciałbyś dowiedzieć się jak sprawnie korzystać z Githuba oraz zrozumieć, czemu ten system jest tak chętnie stosowany przez programistów na całym świecie - to najlepsza metoda!
W poprzednich lekcjach modyfikowaliśmy naszą historię zmian korzystając z różnych poleceń.
Korzystając z checkout korzystając z revert i z reset.
O ile dwa pierwsze przesuwały nasz Head do przodu czyli dodawały kolejne zmiany które zmieniały nasz
stan całego projektu o tyle git reset działa w drugą stronę że on cofał head czyli cofał początek naszego
brancha w historii do wcześniejszych commitów.
Tak jakby one się nigdy nie zdarzyły.
Czyli praktycznie zmieniał zapisaną historię.
I w tym momencie jeśli tutaj zrobię git log powiedzmy 3 no to ostatnim moim commitem to poprawione notatki i ten commit
powstał poprzez cofnięcie zmian w ostatnich trzech commitach ale zostawienie plików tak czyli ja cofnąłem commity.
Ale zmiany wprowadzone zostały w katalogu roboczym i mogłem go scommitować go jeszcze raz z nową nazwą jako
nowy commit poprawione notatki jednak czasem może się zdarzyć że właśnie po takich porządkach po sprzątaniu
historii chcieliśmy coś odzyskać.
Czyli nasz lepszy commit nasz gorszy commit.
Te rzeczy.
One dalej istnieją w gicie ale nie są dostępne.
To znaczy jedyny sposób teraz na dostanie się do commitów to jest przez referencje przez master przez head
czyli jakiś punkt jakąś etykietę po której możemy znaleźć commit a z tego commita po prostu znajdujemy
po kolei jego rodziców w tym momencie nasz master master head wskazuje na commit poprawione notatki który jest rodzicem
commitu nowej linii itd itd.
Mam tutaj nową historię ona się rozgałęziła i teraz w jaki sposób dostać się do tego commita który straciliśmy wyrzuciliśmy
go tutaj z naszego dostępnego zasięgu czyli on nie jest tutaj nigdzie osiągalny nie możemy do niego się
dostać i tutaj gdybym miał jego hash to jak pamiętasz poleceniem git reset mógłbyś się z powrotem do niego przyłączyć.
Problem w tym że to było w poprzedniej lekcji nie zapisałem tego hasha.
Aha no nie mogę go znaleźć.
Jak widzisz git log pokazuje mi tylko bieżącą historię czyli od tego commita poprawione notatki nie mam tej historii
w której zrezygnowaliśmy z której się wycofaliśmy.
Idziemy nowym torem i tylko to co tutaj jest widoczne jest dostępne.
Więc gdybyśmy chcieli przywrócić jakąś wcześniejszą historię którą wyedytowaliśmy to jeszcze nic straconego.
Te commity istnieją w gicie tylko musimy jakoś się do nich dostać.
I bardzo fajnym poleceniem do tego jest git reflog i git reflog to jest ciekawa rzecz bo o ile log pokazuje
commity w naszej aktualnej historii tak git reflog śledzi referencje czyli śledzi co się dzieje np. z
master z head i z naszymi innymi gałęziami czyli jak widzisz mamy po kolei informację na którym commicie
był nasz head.
Jeśli się przyjrzysz każdy commit tutaj nowy dodaje właściwie przesuwa wskaźnik head na właśnie tego commita
który był dodany reset natomiast jak widzisz przesuwa head na inny commit i git reflog całą taką historie
zapamiętuje.
Zwróć uwagę że iż pokazywałem ci różne sposoby resetowania tu mam tutaj cały czas te wszystkie nasze
próby soft head itd.
Przesunięcie się do przodu do tyłu do przodu do tyłu.
Całą tę historię mamy widoczną i dodatkowo tutaj jak widzisz ma mój lepszy commit.
Czyli gdyby te wszystkie zmiany okazało się że jednak tu był błąd że jednak strasznie poprawiliśmy naszą
historię że zupełnie to jest nie to co chcieliśmy i chcieliśmy zacząć od początku zrobić to lepiej to
nie ma problemu ja mogę sobie tutaj jak widzisz odzyskać z powrotem ten commit albo już to inaczej będziesz mógł
zrobić to relatywnie czyli na przykład cofnąć się o 23 do tyłu czyli taki zapis nazwa gałęzi np. master albo bezpośrednio
head czyli ta na której jesteśmy małpa i w nawiasach informacja o ile wersji.
Ale uwaga nie o ile commitów wstecz tylko o ile przestawień naszego heada chcemy się cofnąć czyli jeżeli się
przełączaliśmy pomiędzy różnymi elementami między różnymi commitami to to polecenie pozwoli mi jakby
cofać to zrobiliśmy w poprzedniej lekcji czyli reset nasz przesuwa różne miejsca a git reflog pokazuje jak się
cofnąć z powrotem to co robiliśmy resetem czyli powiedzmy że chcemy ten lepszy commit odzyskać nie ma problemu
pożyczę sobie tutaj ten id git show.
Jak widzisz tu jest nasz lepszy commit.
W tym momencie w naszym pliku witaj mamy dwie linie i dodanie tego commita usunie nam te dwie linie i doda z powrotem
witaj świecie czyli to co mieliśmy wczoraj w naszym lepszym commicie jak pamiętasz.
Jeśli chce znowu przesunąć zmienić historię korzystam w tym celu z git reset i git reset i podaje tutaj albo lepszy
commit po prostu jego hash albo tak jak widziałeś w git reflog podaje head.
Małpa i on był 23 przesunięcia heada do tyłu
git status i teraz nasze obecne zmiany pamiętasz git reset zostawia nam w katalogu roboczym że gdybyśmy chcieli
coś z nimi zrobić czyli nasz ostatni teraz commit ten który w poprzedniej lekcji stworzyliśmy z tych trzech
commitów on tu został cofnięty a jego zmiany zostały pozostawione w katalogu roboczym.
Natomiast nasza historia git log wygląda tak jak wyglądała przed poprzednią lekcją czyli z powrotem
wróciłem tutaj mamy lepszy commit a przed nim mamy nasze tutaj niezmienione te trzy commity czyli wszystko
co zrobiliśmy w poprzedniej lekcji mogłem jednym poleceniem cofnąć i nie tylko jeden commit.
Nie tylko moje pliki ale mogłem całą historię z powrotem odzyskać.
I właśnie polecenie git reflog pozwala mi przeglądać historię zmian w mojej historii czyli gdzie znajdowaliśmy
się z head czyli z początkiem aktualnego brancha i w momencie gdy jak widziałeś w poprzedniej lekcji zmodyfikowaliśmy
historię czyli jakby pozbyliśmy się commitów poprzesuwaliśmy połączyliśmy commity razem to wszystko
jest także odwracalne pod warunkiem że tutaj dostęp też jest w reflogu reflog ma tylko jedną ważną zasadę
działania że on jakby nie trwa wiecznie.
Domyślnie długość takiego refloga wynosi do 90 dni czyli jeśli twoje zmiany ale zmiany na historii.
Jeśli przesunąłeś head np. do tyłu żeby jakoś cofnąć zmiany lub przestawiłeś head do przodu żeby jakoś
odzyskać zmiany jakiekolwiek przesunięcie by było na commit dodajesz zdejmujesz.
z bieżącej historii no to każdą taką operację możesz odszukać odpowiednio i przywrócić
tak jak to zrobiłem przed chwilą zwróć uwagę że nawet jeśli przywracamy z refloga coś jest to tylko po prostu reset
czyli jak widzisz.
Nasza ostatnia operacja pojawiła się tutaj mamy dokładnie opis że przesunęliśmy się do head 23 względem
tego czyli to będzie head dwadzieścia cztery.
Czyli tu 23 plus ta jedynka czyli przesunęliśmy się tutaj.
Nawet jeśli zmodyfikuję historię i wtedy zmienię zdanie że jednak może nie chciałem poprzednią wersję to
też nie ma problemu możemy w każdej chwili powrócić tutaj do tego miejsca
gitlog mamy lepszy commit git reset mógłbym z powrotem wrócić tam gdzie byliśmy
i mamy poprawione notatki mogę spokojnie przełączać się między różnymi wersjami historii pod warunkiem
że mam gdzieś do nich dostęp.
Że mam je albo w reflogu albo mam utworzoną gałąź i etykietę o gałęziach etykietach będziemy rozmawiać
w kolejnych lekcjach.
Tutaj chcę ci pokazać właśnie co się stanie gdy zapomnimy utworzyć etykiety gdzie takiego dostępu uchwytu
nie masz po prostu nigdzie zapisanego.
Zawsze możesz go odzyskać z git.
Reflog.
I tu jeszcze bardzo ważna rzecz jeśli ten git reflog jest długi to może ciężko być cokolwiek w nim znaleźć.
Git.
Reflog ja tu jeszcze raz cofnę z powrotem do tego head 23 czyli do tego commita zwróć uwagę że ten c 8 a 8 commit to jest
dokładnie ten sam commit co tutaj przesuwam się pomiędzy commitami.
I to już zmienia mi całą historię bo tu każdy z commitów ma innych rodziców.
Tak.
Czyli wynika jakby z innej historii jest inną wersją odgałęzienia naszej historii czyli jeszcze wrzucę tego naszego
lepszego commita git status nic tu nie mamy.
OK git reset.
Cytując pamiętaj o tym że jeszcze możesz korzystać z opcji mixed hard i soft.
Jeśli masz jakieś pliki robocze i chcesz aby je zachować w katalogu roboczym a umieścić w indeksie albo
chcesz ich całkowicie się pozbyć chcesz cały nasz projekt przełączyć.
Tutaj witaj nam został git reset z opcją hard to żadych plików nie ma tak.
Czy z opcją mix zostawi nam pliki z opcją soft do indeksu z opcją hard.
Po prostu wyczyści więc uważaj jak resetujesz z opcją hard bo może się pozbyć wszystkich nie zapisanych
plików.
Oczywiście plik witaj można odzyskać bo on jest w historii.
W kilku wersjach ok git reflog tak naprawdę jest to skrót dla git log.
Minus g oneline.
Oneline i opcja jak widzisz polecenie git log dało mi ten sam efekt.
Jeśli podam go z flagą g.
I tutaj jeszcze jest parę innych parametrów które tą stronę oczyszczają i co to oznacza.
To oznacza że ja mogę polecenie git reflog wykonać praktycznie ze wszystkimi innymi poleceniami git loga.
Na przykład mogę podać że chcę tylko 5 commitów.
Mogę podać że chcę jakiś inny format.
Albo mogę np. w bardzo prosty sposób wyszukać tutaj jakieś commity w czasie np. before i powiedzmy tu było
two weeks ago.
W ten sposób.
Tak czyli jak widzisz wszystkie polecenia które poznaliśmy przy git log.
Możesz te wszystkie różne sposoby filtrowania według daty według zawartości według autora itd itd.
Można stosować do git refloga dzięki czemu będzie tobie także dużo łatwiej znaleźć odpowiednie commity
i zobaczyć gdzie byliśmy na których commitach byliśmy np. dwa tygodnie temu z naszym headem zrobiliśmy
porządki w katalogu notatki dodawaliśmy tutaj widzę ignorowanie katalogów.
Czyli jak widzisz git.
Reflog jest to bardzo potężne narzędzie to że ono buduje na git logu ale pokazuje nie zmiany z naszej bieżącej
historii tylko pokazujemy wszystkie historie w których byliśmy tak czyli ogólnie.
Ja pracuję na tym commicie i jego rodzicach na których jestem teraz czy przed chwilą byłem w innym commicie który
miał zupełnie innych rodziców a w ten sposób zupełnie inną historię.
Ja mogę odszukać te rzeczy i mogę przy użyciu płacenia git reset który już mam nadzieję znasz i
czujesz się dobrze i komfortowo możesz spokojnie widzisz poruszać się po historii i przeglądać zmiany
a także układać modyfikować nowe gałęzie historii.
A jeśli coś pójdzie nie tak bez problemu git reflog odnajdujesz.
Gdzie byliśmy poprzednio i możesz przełączyć się z powrotem w to miejsce w którym byłeś.
Mam nadzieję że jest to bardzo przydatne jeśli coś się tutaj popsuje przy korzystaniu z reseta.
Pamiętaj że zawsze git reflog idzie na ratunek i zawsze pozwoli ci odnaleźć zmiany pod warunkiem że te zmiany
nie były dokonane dłużej niż trzy miesiące temu.
Jeśli mam już jakieś ważne zmiany no to lepiej zapisywać je przy pomocy etykiet i gałęzi.
Ale o tym już w kolejnych lekcjach natomiast w kolejnej lekcji zobaczysz jeszcze jeden fajny sposób
na modyfikowanie historii w sytuacjach np. takiej jak u nas git log gdy mamy kilka commitów i niekoniecznie
chcemy po prostu się cofnąć chcielibyśmy pozmieniać kilka commitów jednocześnie ale bez wyrzucania ich historii
chcemy zmienić ich opisy historie lokalizacje.
Ale o tym już w kolejnej lekcji do zobaczenia.