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!
Pamiętasz w poprzednich lekcjach korzystaliśmy z poleceń git checkout i git reset do cofania naszych bieżących
zmian czyli zmian w naszym katalogu roboczym lub zmian zaindeksowanych czyli przygotowanych do scommitowania.
Jak widziałeś lekcję temu polecenie
git checkout ma dużo szersze możliwości polecenie git checkout pozwalało nie tylko zarządzać bieżącymi
plikami ale pozwalało wydobyć z historii wcześniejsze wersje plików i przywrócić do katalogu roboczego.
Podobnie sytuacja ma się z poleceniem git reset nie służy ono tylko do zarządzania naszym indeksem ale
ma dużo większe możliwości i w tej lekcji właśnie zajmiemy się możliwościami polecenia git reset a mianowicie
pokaże ci jak z polecenia git reset można modyfikować historię i zaraz co to znaczy jak ponieważ polecenie
git revert pozwalało przywrócić zmianę cofnąć zmiany poprzez dodanie nowej zmiany która była odwrotnością
była przeciwieństwem wybranej zmiany czyli szliśmy do przodu dodaliśmy nowe zmiany które były odwróceniem
wcześniejszych zmian.
Git teraz działa w inny sposób git reset pozwoli nam faktycznie zmodyfikować istniejące już commity.
Nim do tego przejdziemy szybkie przypomnienie jak działa git reset i git checkout z naszym indeksem czyli
jeśli tutaj git status mówi mi że nie ma żadnych zmian dodam więc jakąś zmianę powiedzmy tutaj w edytorze w pliku
witaj dodamy kolejną linię niech będzie kolejna zmiana status.
Mamy tutaj zmiany nie zmodyfikowaną nie zapisaną.
Czyli git add witaj.
I to jak pamiętasz zapisze nam do indeksu git status i jak widzisz u góry mamy tu informację że git reset przywróci
nam ten plik z indeksu potem do katalogu roboczego ale co git reset robi naprawdę to zresetowanie
indeksu do danego commita lub zresetowanie indeksu do wybranych plików danego commitu zwróć uwagę że
jeśli poziom git reset head to znaczy że właśnie tutaj z commita który jest tutaj czołem naszego brancha
który jest na początku naszego brancha z tego commita ja chcę plik witaj kropka txt.
Przywrócić do indeksu natomiast to co jest w indeksie domyślnie umieścić w katalogu roboczym i to jest
tak troszeczkę może wydawać się mylące ale podejście myślenie w ten sposób pozwoli ci zobaczyć jak naprawdę
działa reset czyli reset nie tylko czyści nam indeks ale reset pozwala tak jak checkout pozwalał wybrać pliki
z wcześniejszych wersji historii i ustawić się w katalogu roboczym tak git reset pozwala wybrać wcześniejsze
wersje plików np. tutaj ostatnim którą mamy zapamiętaną.
Czyli ta przed zmianami i pozwala wcześniejsze wersje ustawić w naszym indeksie ale robi jeszcze jedną
fajną rzecz którą nie robi checkout git reset domyślnie wszystko co mieliśmy tutaj w indeksie umieści
w katalogu roboczym a to co wybieramy z wcześniejszej wersji umieści w indeksie czyli robimy coś w rodzaju
żonglowania plikami żeby nie stracić żadnych tych zmian gdyż mamy trzy miejsca mamy indeks mamy katalog
roboczy mamy naszą historię i git reset robi taką podmianę czyli z historii czyli z naszego ostatniego
commita wybieram plik witaj umieszczam go w indeksie a nasze zmiany umieszczam w katalogu roboczym.
Zobaczmy.
Teraz tutaj plik jest z powrotem nie zmodyfikowany a w naszym tekście nic nie ma.
Żeby pokazać Ci jak git reset wydobywa także z historii poprzednie wersje i lepiej zobrazować ci jak on
tutaj działa.
Spróbujmy przywrócić wcześniejszą wersję witaj w tym momencie w naszym katalogu roboczym mam plik witaj
i on jak go sobie podejrzymy w edytorze ma nasze zmiany.
Czyli witaj jeszcze jedna linia w pliku i kolejna zmiana i teraz chciałbym przywrócić jakąś wcześniejszą
wersję.
Spróbujmy zobaczyć co mamy we wcześniejszych wersjach git log powiedzmy z 5 wersji.
Powiedzmy że to jest nasza ostatnia to nasz head to jest head 1 do tyłu to jest head 2 do tyłu.
Spróbujmy tę wersję git show zobaczyć co tu się stało w tej wersji ok czyli w tej wersji jak widzisz została
usunięta linia druga w pierwszym nie została zmieniona tutaj Enter został usunięty i mamy tylko jedną linię
jeszcze raz go tutaj wyświetlę i teraz poleceniem git reset.
Ja mogę sobie wybrać dowolny commit mogę wpisać tutaj jego hash albo mógę zrobić tutaj względną ścieżkę
podać czyli aktualny head na którym mamy ostatni commit i nie jeden a dwa commity wcześniej czyli dwa commity
przed tym który jest ostatnim na naszym tutaj naszej gałęzi git reset i podam ścieżkę do pliku witaj.
Czyli zwróć uwagę że podobnie jak git checkout head minus 2 przywracał nam plik z wcześniejszej wersji
i umieszczał go w katalogu roboczym.
Tak git reset pracuje na indeksie czyli plik witaj txt
umieścił w indeksie czyli widzisz gid reset jest bardzo potężnym narzędziem bo jeśli pracujemy na jakimś
pliku i coś tam nie pasuje chcielibyśmy go zobaczyć porównać np. z poprzednią wersją to ja nie muszę od razu
kasować moich zmian mogę wybrać wcześniejszą wersję umieścić ją w indeksie a nasze zmiany mogę dalej
mieć tutaj w pliku witaj txt.
Porównajmy te pliki jak one wyglądają.
Dla porównania wyświetlę jeszcze raz ten commit czyli ten komitet który przywracaliśmy to było witaj
świecie
aktualnie w katalogu roboczym mamy tutaj nasze zmiany jak zrobię git diff witaj.
Tutaj są nasze zmiany czyli jest kolejna zmiana ale jak widzisz git diff porównuje to z nie ostatnim
commitem tylko z indeksem a w indeksie zobacz.
Jest tutaj
usunięta linia witaj świecie i zrób jeszcze git.
Diff.
Czyli porównajmy czym się różni indeks od ostatnio zapomnianej wersji.
I tu jak widzisz jest przywrócona tamta zmiana.
Czyli jeżeli jeszcze raz bym scommitował
to nie nasze zmiany zostały umieszczone tylko w commicie zostanie umieszczony plik witaj a moje zmiany
tutaj dalej możemy sobie na nich pracować i mam kilka możliwości mogę iść do przodu.
Czyli mogę scommitować witaj który mam w indeksie edytować
witaj lokalny.
Jeśli chciałbym się wycofać w którąś stronę czyli wybrać którąś z tych wersji bez commitowania to kilka
opcji rzecz pierwsza rzecz którą muszę zrobić muszę zrobić coś w tym plikiem tutaj witaj txt i mogę albo zrobić
git add i git add
zaktualizuje mi tutaj indeks czyli ta wersja witaj txt.
Czyli git add.
Witaj w ten sposób ten plik nadpisze mi to co będzie w tym pliku.
Spróbujmy tutaj sobie skopiuję zmianę.
Żebyś widział dokładnie co stracimy a co pozostanie.
Czyli teraz poleceniem git add.
Ja to co mam tutaj ustawione w edytorze nadpiszę to co jest tutaj zapisane a tutaj mamy tylko jedną linię
ponieważ mamy ten cofnięty commit czyli ten commit który usuwa zostaje tylko pierwsza linia.
Czyli robiąc witaj
mam tylko w indeksie witaj txt i są tutaj moje zmiany wykonam jeszcze raz to co poprzednio czyli
jeszcze raz przywrócę poprzednią wersję witaj status i teraz w indeksie jest ta wersja head minus dwa w katalogu
roboczym są moje zmiany czyli jak widzisz add sprawiało że traciliśmyto co jest w indeksie kolejną opcją będzie wykorzystanie
checkout i teraz checkout na dwa sposoby.
Mogę zrobić git.
Checkout.
Tutaj bez wersji witaj.
I takie coś pobierze ostatnio zapamiętaną wersję.
Czyli nie head nie commit tylko jeśli mamy indeks to pamiętaj ostatni zapamiętany jest indeks.
Czyli w tej sytuacji ja utracę zmianę tutaj a przywódcę te zmiany spróbujmy.
Git status mam.
Tylko jak widzisz indeks straciłem te zmiany i tutaj jak widzisz mam tylko w indeksie czyli jedną linię.
Jeszcze raz wprowadzę nasze zmiany żebyś tu widział kolejny sposób
git status i ponownie mamy
w indeksie zapisaną jedną linię natomiast u nas w katalogu mamy trzy linie próbowaliśmy zrobić add czyli
nadpisywaliśmy indeks robiliśmy checkout.
Czyli indeksem nadpisywaliśmy nasz plik witaj.
Mogę też całkowicie pozbyć się zmian robiąc git.
Checkout i wybrać jakąś wersję np. head witaj i takie rozwiązanie chyba jak widzisz już po prostu przewróciło mi
plik witaj do danej wersji czyli zarówno to co mamy w indeksie i to co mieliśmy zapisane nie ma żadnej
z tych wersji czyli ani nie jest jedna linia ani czyli nie trzy linie w tym momencie po prostu przywróciłem ostatni commit
i skasowałem wszystkie moje zmiany i te i te więc tutaj jeszcze raz robię to samo jeszcze raz tutaj zapisze
nasz plik.
Jeszcze raz przywrócę z historii tą starszą wersję czyli te dwie commity wcześniej mam w indeksie mam jedną
linie u nas mam trzy linie i mogę zrobić jeszcze git reset head witaj.
I to do indeksu przywróci mi wersję z dwiema liniami i wtedy indeks jak widzisz będzie równy ostatniemu
commitowi czyli w indeksie nie będzie żadnych zmian będzie pusty jak przywrócę do indeksu
coś co jest już wcześniej.
No to nie ma żadnych zmian nie ma nic w indeksie bo nie ma nic do zrobienia natomiast to co mamy w indeksie normalnie
przeszło by do katalogu roboczego ale w katalogu już są jakieś zmiany jest to miejsce jest zajęte.
Tutaj mamy nasze zmiany jeszcze skopiuję więc jest sposób żeby odzyskać to co mam w indeksie do katalogu
roboczego móc pracować dalej na tych zmianach to reset ale nim zresetuję.
Indeks musimy zrobić tu miejsce czyli musimy z powrotem przywrócić git checkout witaj
i w tym momencie widzisz jedyną zmienną jaką jest to jest indeks jeśli chcę mogę zrobić git reset.
head witaj.
I mamy pojedynczą linię czyli to co przywróciłem dwa commity wcześniej w moim katalogu roboczym.
Jak wspomniałem na początku tej lekcji git checkout git reset pozwala robić jeszcze jedną rzecz.
Dotychczas pracowaliśmy tylko na pojedynczych ścieżkach na plikach katalogach wybierzmy tylko które
pliki nas interesują.
Teraz muszę ci pokazać co się stanie jeśli ja wykonam polecenie git reset jakby na całym commicie na całej
zmianie czyli nie wybiorę pojedynczych plików tylko będę resetował całe commity wyczyszczę git
status i powiedzmy że nasze zmiany nasz witaj txt czyli tutaj teraz to wygląda w ten sposób niech będzie
może tak witaj świecie git status
git add.
Witaj git comit i zrobię tu jakiś szybki commit.
Ok, zrobiłem commit.
Nie dość że ta wiadomość jest bardzo brzydka tutaj jeszcze zrobiłem literówkę zamiast commit jest tutaj przez
k kommit no to jeszcze w środku faktycznie no te zmiany mi się nie podobają i teraz mam kilka możliwości
tak jak pamiętasz.
Jeśli mam git log powiedzmy tutaj jeden jeśli mam commit i chce zmienić jego wiadomość message może być git commit amend.
Ale git commit amend to taki skrót który tak naprawdę resetuje commit i commituje go jeszcze raz.
Powiedzmy mamy tu czysty katalog żadnych zmian i chciałbym poprawić ten commit.
Nie zrobić revert nie robić jeszcze jeden commit jeszcze bardziej to zaśmieci naszą historię tylko chciałbym
zmodyfikować kod który już zrobiłem i mogę wykorzystać do tego właśnie git reset.
Jeśli git reset wykonam tutaj powiedzmy git reset head minus 1 dodam 1.
Czyli chce cofnąć ten commit ale tutaj nie podam konkretnej ścieżki.
Nie chcę konkretnych plików cofać chcę cofnąć wszystko całą zmianę to git reset uruchomiony w ten
sposób on nie będzie miał pojedynczych plików on będzie zmieniał cały commit więc spróbujmy git reset jeden tutaj.
I jeszcze dodam taką opcję jak soft i ta opcja soft sprawi że wszystkie zmiany z tego ostatniego commita
są umieszczone w moim katalogu.
W moim indeksie jak zobaczysz teraz historię git log powiedzmy 2 to zwróć uwagę nasz szybki commit
po prostu zniknął.
Cofnęliśmy head o commit do przodu ale w taki sposób że zmiany pozostały czyli ja mogę teraz jeszcze
raz scommitować.
Git commit
lepszy lepszy commit git log 2 czyli jak widzisz git reset bez ścieżek tylko z samym numerem commitu lub samą referencją do jakiegoś
commitu pozwala nam przesunąć wskaźnik head do tyłu o 1 2 lub więcej commitów ale opcja soft pozwala mi
zestawić wszystkie pliki czyli zobacz ja mogę cofać commity ale bez utraty zmian bez utraty plików.
I mogę wtedy jeszcze raz scommitować z poprawną wiadomością mogę także wprowadzić zmiany przez commitowanie.
Nie ma problemu mogę spokojnie pracować nad plikiem txt.
Mam też inną opcję.
Mam tutaj git log 2 teraz mam ten lepszy commit tylko nie podoba mi się powiedzmy że chciałbym całkowicie się
go pozbyć.
Nie tylko message poprawić ale pliki też te zmiany mi się zupełnie nie podobają.
Zmierzam tego commita zupełnie usunąć git reset znowu cofnę o jeden ale tym razem użyje opcji hard i teraz zobacz co się
stało head po prostu przesunął się do commita notatka przeczytaj to czyli tutaj czyli cofnęliśmy wskaźnik stąd
master head stąd przeskoczył tu tak aby ten commit się nigdy nie zdarzył.
I teraz git log 3 my mamy historię która już nie zawiera tego commita.
Pozbyliśmy się go stąd ale on nie został usunięty bo pamiętaj jedyne co zrobiłem to zresetowałem.
Czyli przesunąłem wersję przesunąłem wskaźnik master head o commit do tyłu.
Tak naprawdę to tutaj się przewinę sobie wcześniej historię tu powiedzmy mam ten epszy commit.
Jeśli mam gdzieś tutaj jego id.
To on nie jest stracony.
Po prostu nic na niego nie wskazuje żaden brand żadna referencja na niego nie wskazuje.
Ale on dalej jest w historii jeśli zrobię tu git show
to mogę go podejrzeć.
Co więcej jak powiedziałem przed chwilą git reset on resetuje czyli przesuwa wskaźnik jeśli powiem po konkretnych
plików.
Jeżeli podałbym pliki to on przesyła pliki a jeśli nie podamy mu konkretnych plików tylko podamy mu commit to on przesuwa nas czyli
mastera aktualną nasz naszą gałąź jego przód jego głowę jego head przesunie tam gdzie my chcemy.
Czyli jeśli tutaj zrobię polecenie gid reset i podam konkretny jakiś commit to to polecenie naszego mastera.
Tam gdzie jesteśmy przesunie nas na ten commit czyli teraz czubek jak widzisz to jest w tym miejscu a ten
tutaj przód czyli ten head czubek tego commita został utracony powiedzmy bądź przesunięty do tyłu.
A jeśli mam tutaj jego identyfikator to mogę śmiało się po prostu zresetować tę gałąź na której jestem
zresetować do tego commita i teraz spójrz na git log z powrotem mam tu na początku lepszy commit.
Czyli on nie zosta całkowicie utracony jeśli go przesunąłem w to miejsce ale jeśli mam do niego inny
numer to mogę z powrotem go przywrócić.
I stałą się jeszcze jedna bardzo fajna rzecz
tutaj jak widzisz mam nie zapisane więc o co chodzi.
Git log 3 zobacz byliśmy na tym commicie.
Tu była jedna linia bo tutaj usunęliśmy drugą linię z naszego pliku witaj cofnęliśmy to do tego miejsca
czyli mieliśmy w pliku dwie linie a następnie znowu przesunąłem się tu ale co zrobił git reset git reset tę wersję
plików w tym momencie on nam umieścił żebyśmy nie stracili.
Czyli jestem teraz na tym commicie z powrotem.
Ale stan w którym tu byłem jest gotowy do scommitowania.
Czyli jak widzisz możemy sobie tu przeplatać możemy faktycznie żonglować.
Jednocześnie naszą pozycją w naszym tutaj headem i jednocześnie przekazywać sobie pliki z wersji w której
byliśmy teraz jak przejdę do edytora to mam dwie linie czyli mam tę wersję stąd niescommitowaną na tej wersji mimo że już znamy kilka
rzeczy mogę albo przenosić te pliki do tej wersji po prostu git checkout.
Mogę też je dodać i scommitować żeby nowy commit nadpisać tego lepszego commita
i myślę że tutaj w tej sytuacji skoro ja ten lepszy commit przywróciłem to tych zmian mogę się pozbyć czyli po
prostu git checkout.
Witaj i stąd mam jedną linię.
Czyli tą zmianę która tu wprowadzała lepszy commit ja tutaj z powrotem ją mam.
Gdybym tą samą operację co przed chwilą wykonał tutaj git reset gdybym z opcją hard to wtedy te pliki zostałyby skasowane
czyli obojetnie czy resetujesz tylko w indeksie czy resetujesz w sensie przesuwasz się do innego commita jeśli
pliki nie są ci potrzebne.
Jeśli chcesz wyrzucić wszystkie zmiany cofnąć do jakiegoś miejsca w którym byłeś cofnąć commity cofnąć pliki
całkowicie przywrócić cały stan.
Tak jakby to się nigdy nie stało.
To tutaj opcja hard po prostu widzisz przesunęła mnie lepszy commit.
i nie ma żadnych plików.
Tak tak samo jeśli cofnę tutaj jest hard do tyłu się czyli pozbędę się teraz tego lepszego commita lub nawet
jeszcze inaczej.
Dodam jakieś pliki jakiś plik mam tu stworzony
jestem na lepszym commicie i chce się go pozbyć czyli git reset i chce się cofnąć w historii o jeden
z opcją hard to już po prostu przełączyłem się na nowy branch i wszystkie pliki które nie są śledzone
zostają.
Ale gdybyśmy mieli tu jakieś pliki które byłyby śledzone one zostałyby usunięte.
Tak widzisz tylko pliki które są poza tym gitem one sobie tutaj pozostaną wszystkie twoje pliki które byłyby w indeksie.
Zamiast tego xxx gdybym wprowadził zmiany spróbujmy jeszcze raz cofnąć tam gdzie byliśmy czyli do tego naszego
zapamiętanego tutaj się cofnijmy na przykład.
Jesteśmy w najlepszym commicie.
I powiedzmy że tym razem nie będę dawał mojego pliku tylko tutaj wprowadzę jakieś zmiany.
Czyli mam zmiany w tym miejscu i cofnę z hardem do tyłu o jeden.
Jak widzisz jeśli cofam pliki które on pamięta to mi nadpisze tymi starszymi plikami nadpisze aktualne pliki jeśli mam
nowe pliki to zobacz on nie ma je czym nadpisać.
Czyli on resetując te pliki resetując cały commit resetuje tylko to co faktycznie tam było.
Jeśli są nowe pliki no to ich nie nadpiszę tak musielibyśmy tutaj jeszcze mając nowe pliki czy jeszcze
raz to zrobić.
Git reset hard
Tutaj dodam zmiany stworzę tu jeszcze jeden plik i mam zobacz zmiany które są śledzone i nieśledzone mam untracked files czyli
zmiany których
nie nadpiszę bo nie ma czym.
I tutaj zmiany które są nie scommitowane i nawet nie dodane do indeksu czyli je stracę
tu jesteśmy teraz na sprawdźmy szybko.
Git log Jeden lepszy commit.
Tak czyli chce się wycofać do tyłu o jeden.
OK i teraz git status straciłem.
Zmiany w tym pliku.
A ten plik tutaj pozostał.
Inną opcją byłoby zrobienie tego na miękko czyli jeszcze tutaj zresetujemy
do przodu.
I powiedzmy że pracuje sobie dodamy jakieś nowe pliki
powiedzmy że zmieniłem istniejące pliki
a tylko mi się nie podoba.
Chciałem to co było w poprzednim commicie oraz moje aktualne zmiany zachować to mogę zrobić jeszcze
jedną opcję mogę zrobić tutaj reset o 1 do tyłu z opcją soft
i teraz zobacz co się stało staram się jak najwięcej plików zachować żeby niczego nie nadpisać.
Czyli tutaj mamy nasze zmiany.
Nasze zmiany on umieścił
w katalogu roboczym.
To co zresetowałem umieścił mi tutaj w indeksie żeby te zmiany mi nie zginęły przypadkiem a mój plik
leży z boku cały czas bo nie jest zupełnie nic się z nim nie dzieje jest tak jak na początku tej lekcji
zobacz mamy tą samą sytuację.
Tym razem jednak nie pracujemy tylko na samym czubku na samym końcu naszego brancha.
Tylko w ten sposób jak widzisz możesz resetować się dowolnie daleko w historii nie tylko na pojedynczych plikach ale na
całych commitach.
I możesz znowu to samo robić możesz albo zresetować aby zrobić checkout aby zrobić add.
Jak widzisz w ten sposób resetują cię o wiele commitów do tyłu.
Możesz wybrać dwie wersje zmodyfikować je porównać i tutaj albo jedną scommitować albo z którejś z wersji
zrezygnować.
Czy tutaj moglibyśmy to co na początku lekcji robiliśmy.
Czyli wybrać którąś wersję.
Może jednak ta mi się nie podoba.
Mogę jednak stwierdzić że te zmiany które miałem tutaj się nie podobają mogę się ich pozbyć.
Czyli git checkout.
Witaj.
I widzimy tylko tą wersję z ostatniego commita z commita który jest tym naszym commitem z którego się wycofaliśmy
bo pamiętaj że git log tutaj lepszego commita już nie ma ale zmiany z lepszego commita są cały czas w indeksie
więc mogę podjąć decyzję czy ja chcę te zmiany z lepszego commita którego usunąłem scommitować czy nie mogę
zmodyfikować ten plik mogę zmiany dodać a mogę tych zmian całkowicie się pozbyć.
Czyli mogę stwierdzić że dobrze wystartowałem z opcją soft bo myślałem że te zmiany mi się przydadzą.
Ale stwierdzam że jednak nie chciałem tylko ten x chciałęm inne zmiany zachować więc mogę te pojedyncze zmiany
z tego commita wyrzucić.
Co się okazuje tych plików może być więcej możesz wybiórczo.
Zdecydować które pliki zostawiasz.
Które pliki zmieniasz.
Które pliki wycofujesz.
My zrobimy sobie git reset ale tym razem zresetujemy do heada tylko plik witaj czyli zostajemy cały czas na
tym comicie na którym jesteśmy.
Bez tego naszego lepszego commita jedyne co robimy teraz to resetujemy jeden plik.
Czyli pozbywamy się tej zapamiętanej wersji witaj chce przywrócić ją do tego na którym jestem i teraz
git status on jest w katalogu roboczym cały czas mogę znowu go zmienić scommitować jeśli chcę całkiem go wycofać to znowu
git checkout.
Witaj i teraz witaj
jest dokładnie równy temu commitowi w którym jesteśmy
może być dla ciebie troszeczkę pokręcone zamotane.
Chodzi o to ile tu jest możliwości i za każdym razem masz jakieś jeszcze pole żeby pliku nie stracić.
Zawsze masz kilka przestrzeni roboczych.
Masz katalog roboczy masz indeks i masz historię możesz operować żonglować tymi trzema.
I plik przechowywać przerzucać między tymi trzema miejscami.
Widzisz praktycznie w dowolnej kolejności i dzięki temu nie musisz kopiuj wklej tak jak tutaj pokazałem
w przykładach.
Nie musisz zmieniać gdzie indziej tylko możesz jednocześnie pracować na praktycznie trzech wersjach
pliku właśnie dzięki tym trzem drzewem w gicie.
Polecam na spokojnie poćwiczyć spróbować jak to wygląda z resetem popróbować jak to wygląda właśnie z reset
z checkout.
Add.
Poćwiczyć sobie lokalnie poćwiczyć sobie jak to wygląda gdy chce zresetować się do wcześniejszej wersji
a tutaj w lekcji.
Ja pokażę ci jeszcze jedną rzecz
tego xxx się pozbędziemy.
Zrobimy sobie git log powiedzmy z 5 i tutaj jak pamiętasz mieliśmy bałagan był tutaj revert checkouty itd.
Tutaj mieliśmy jeszcze porządek więc git reset pozwala mi cofać się dowolnie daleko czyli mogę cofnąć
się head tylda jeden head dwa head trzy czyli mógłbym te wszystkie commity
zmodyfikować.
Spróbujmy git reset head 1 2 3.
Teraz jaka opcja.
Czy ja chcę zmiany tracić.
Nie to było dużo pracy ja chcę je zachować.
Czy mam jakieś pliki w indeksie.
Nie mam jakichś plików w indeksie więc myślę że mogę spokojnie zrobić to w ten sposób git reset head trzy i będziemy
mieli te pliki w katalogu roboczym a możesz robić soft
i mam od razu pliki w indeksie
tutaj mam gdzieś moje zmiany i jeszcze przeczytaj to
pusty plik diff
tak została usunięta ważna informacja i to zostało praktycznie zmienione w tych plikach.
No tak bo tutaj widzisz zmieniałem notatki tylko to a te commity były praktycznie odwrotnością czyli
to co się stało tu zostało cofnięte więc faktycznie jedyna rzecz której sensowna stała się w tym commicie
czyli te wszystkie trzy commity jak widzisz tak naprawdę zmieniły tylko jeden plik więc posprzątajmy tutaj.
Ja mogę scommitować to jeszcze raz.
I zamiast podawać wiadomość tutaj zamiast podawać nowy message to ja mógłbym faktycznie wykorzystać message który
był w ostatnim headzie tzn.
Git commit
też nie potrzebuje git commit c i w pliku orig head znajduje się widzisz wiadomość z ostatniego commita.
Jeśli cofasz się modyfikujesz commity i chcesz zachować ostatnią wiadomość to możesz wykorzystać właśnie ten plik orig
podkreślnik head.
Ja z tego wyjdę
zrobił mi się commit status git log.
Trzy ok czyli jak widzisz te wszystkie trzy commity zostały spłaszczone w jeden i jeszcze raz go zmodyfikujmy.
Czyli znowu git reset.
head 1
soft git status i jeszcze raz git commit.
Ta wiadomość mi się nie podobała poprawione notatki
ok
jak widzisz w ten sposób git reset nie tylko pozwala nam na indeksie nie tylko pozwala nam wydobywać jakby
cofać się wcześniejsze commity ale jak widzisz mogę cofnąć kilka commitów zresetować nasz stan.
Master head do wcześniejszego commita ale nie tracąc zmian.
Czyli ja tracę commity ja tracę informację o tym co zostało zmienione kiedy tracę w wiadomości message tego commita autorów.
Ale zobacz zmiany zostają i mogę jeszcze raz jest scommitować albo po kolei pojedynczo albo kilka naraz.
Czyli w ten sposób cofnęliśmy historię.
Ja zmodyfikowałem i nie dodawałem kolejnych kroków tylko ja istniejące kroki wybrałem z nich wszystkie zmiany
wybrałem z nich wszystkie pliki pozbyłem się wszystkich wiadomości commitów i te wszystkie pliki wszystkie zmiany
z tych plików z tych commitów jeszcze raz scommitowałem.
Tym razem już ze zmienionym tytułem czyli wyobraź sobie taki git reset zachowuje się powiedzmy jak git amend.
A jest dużo potężniejszy dlatego że zobacz mogę się cofać dowolną ilość commitów albo cofnąć nawet
do konkretnego commita i pozbyć się po prostu fragmentów historii które mi się nie podoba.
Ważne jest to że będziemy w kolejnych lekcjach.
Pamiętaj że jeśli modyfikujesz się historię to żeby zrobił to tylko na lokalnym komputerze bo jeśli zwróć
uwagę nasze zmiany wszystkie wcześniejsze wysłalibyśmy komuś dalej jakby pracował dalej na nich.
A ja bym sobie fragment historii wyciął i w dodatku commity tutaj to nasze całe historie byłyby różne.
Więc pamiętaj żeby wszystkie operacje na historii żeby resetowanie zmiany git amend itd.
Żeby te wszystkie zmiany na pewno wykonać jeszcze nim podzielisz się swoimi commitami z innymi użytkownikami
dlatego że jeśli później masz inne historie no to ciężko jest z powrotem że tak powiem powrócić do wspólnego
miejsca.
To tyle jeśli chodzi o git reset do prasy lokalnej jeszcze do checkouta i resetu na pewno powrócimy.
Polecam naprawdę jeszcze raz się zatrzymać poćwiczyć sobie na jakichś testowych plikach jak działa reset
add i checkout jak działa reset właśnie z cofaniem kilku commitów żeby właśnie to dobrze się czuć swobodnie komfortowo
z tym bo tu jak widzisz bardzo łatwo usunąć żeby jakieś zmiany tak czy tu korzystając z opcji reset hard
czy to nawet korzystając z opcji zwykłego resetu kiedy mamy coś nieskomitowane mamy coś w indeksie więc polecam
jeszcze poćwiczyć żeby to było bardziej jasne a w kolejnych lekcjach pokaże jak odzyskać utraconą historię
oraz jak jeszcze w wygodniejszy sposób edytować historię.
Do zobaczenia.