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!
Gdy wiesz już jak swobodnie pracować z gałęziami wiesz jak bez problemu przełączać się na inne dodatkowe
gałęzie i z powrotem do gałęzi Master to może pojawić się pewien mały problem.
Mianowicie jeśli rozpocząłeś już jakąś pracę np. na gałęzi master nie scommitowałeś jej jeszcze to
że nie jest to praca dokończona i nie chciałbyś jej jeszcze commitować.
Ale chciałbyś na chwilę coś przetestować zobaczyć żeby przełączyć na inną pracę przełączyć się na inną
gałąź i jest pewien problem.
Spróbujmy ja na przykład tutaj do naszego przykładu dodam jeszcze powiedzmy jakąś listę
powiedzmy podstawy git.
I dodamy jeszcze jakiś rozdział praca lokalna i to będzie nasz spis treści
h2
powiedzmy wprowadzimy jakieś dowolne zmiany w naszym pliku ale jeszcze nie skończyłem tutaj chciałbym
mieć jeszcze kilka elementów li.
I ta lista nie jest dokończona.
Tutaj jak zobaczysz git status mamy nie zapisane zmiany ja chciałbym na razie zatrzymać się tu i przyłączyć się
do gałęzi.
Nowy nagłówek i gdy próbuje takie polecenie wykonać git teraz mnie powstrzymuje żebym przypadkiem nie
utracił tych nie zapisanych zmian.
Tutaj widzisz mam komunikat że twoje lokalne zmiany zostałyby nadpisane przez plik index html czyli przez
commituj zmiany lub uwaga stash zestashuj zmiany czyli odłóż zmiany na bok.
Teraz jak możemy odłożyć zmiany na bok przed zmianą branchy służy do tego polecenie właśnie git stash
i wykonując samo to polecenie bez żadnych argumentów.
W ten sposób domyślnie zapisuje ono wszystkie zmienione pliki oraz pliki w indeksie do tak zwanego stashu
i tu masz informację zapisano właśnie katalog roboczy i indeks pod nazwą work in progress w i p.
To jest informacja Work in Progress nie ukończona praca na gałęzi master i tu też mam informację jaki
był ostatni commit na tej gałęzi na którym wprowadziliśmy te zmiany które sobie zapisaliśmy i teraz zrobię
git status.
Tutaj nic nie ma tutaj mojej zmiany zniknęły.
Mogę się swobodnie przełączyć do nowy nagłówek mamy nasz zmieniony nagłówek praktyczne porady mogę wrócić
z powrotem
master
i co się stało z tymi zmianami.
Zmiany te zostały zestachowane czyli git stach i poleceniem git stash list bez myślników możesz wyświetlić
listę takich zestachowanych zapowiadanych zmian.
I tu mamy stach.
Jak widzisz notacja tu jest bardzo podobna do notacji reflog czyli każdy kolejny stash jest dodawany z
takim symbolem małpa i numer w środku i mamy tą wiadomość która została automatycznie wygenerowane dla
nas.
I teraz jak takie zmiany przywrócić.
Mianowicie mam też polecenie git stash pop i git stach pop robi dwie rzeczy stach jak widzisz wyświetla mi status czyli
mój plik index html powrócił z powrotem tutaj ma mój spis treści niedokończony ale dodatkowo tu informacja
jest dropped stached czyli polecenie git stash pop zdejmuje z listy zastachowanych zmian ostatnią zmianę
jaka została dokonana czyli pierwsza rzecz która z brzegu jest numerkiem 0 zostanie przywrócona oraz
ta zapisana zmiana w stachu zostanie usunięta żeby tam nie pozostawał bałagan niepotrzebny.
Czyli teraz jak zrobię jeszcze raz git status mamy z powrotem nasz index html git stash list tutaj nie mamy żadnych
przechowywanych informacji i chcemy pokazać jeszcze dwie ważne rzeczy.
Czasem może się zdarzyć że dodajemy jeszcze jakieś nowe pliki lub nie chcemy części plików zestashować
tu utworze powiedzmy plik podstawy HTML ale niech on będzie pusty.
Jeszcze raz zrobię git status mamy dwa pliki mamy plik index HTML i plik podstawy HTML gdzie uwaga plik
index HTML już wcześniej istniał ja go modyfikuje natomiast plik podstawy HTML jest zupełnie nowym plikiem
jest plikiem tzw. nieśledzonym przez gita.
I jeśli ja w tym momencie zrobię stash
sprawdźmy git status.
To jak widzisz plik HTML trafił tutaj do naszego stasha natomiast podstawy HTML jako plik nieśledzony przez
git nie został zabrany jeśli przełączysz na inny branch.
Na przykład git checkout nowy nagłówek.
Mogę bez problemu to zrobić dlatego że plik podstawy HTML nie koliduje z żadnym innym plikiem z powrotem.
git checkout.
Master jeśli jednak chciałbym faktycznie posprzątać tutaj nie przynosić nie zaśmiecić innych branch jakimiś
plikami z tego brancha robię git stash pop zamiast polecenia pop mogę wykonać polecenie git stash apply
i poleceniem git stash apply.
Jak widzisz przywracam z powrotem plik index HTML.
Ale polecenie apply w przeciwieństwie polecenia pop nie usuwa nie robi drop tutaj czyli nie usuwa tego
zapisanego pliku czyli mam go tutaj i jednocześnie mam go z powrotem w moim katalogu głównym i co zrobić
żeby dodać tutaj jeszcze jedną pozycję na stashu bo ich tam może być naprawdę wiele ale tak żeby
tutaj zawarł wszystko czyli także nieśledzone pliki git stash save i jeśli podam tutaj polecenie include
untracked lub w skrócie po prostu polecenie u to takie polecenie zapamiętam mi nie tylko te zmiany
które tutaj mam ale także właśnie untracked czyli nieśledzone pliki.
Sprawdźmy i teraz git status jak widzisz nic tu nie mamy.
Natomiast w naszym stashu zobaczmy git stash list mieliśmy już dwie zmiany.
No właśnie czyli informacja jest ta sama.
Czyli mamy dwie różne zmiany ale opis który dodaje git jak widzisz tutaj mamy tylko informację o ostatnim commicie
plus informacja work in progress.
Jeśli chciałbym troszeczkę lepiej zapisać tę zmianę spróbujmy jeszcze git status i tak tu nic nie mamy więc ja przywrócę jeszcze
raz git.
Stash pop ostatnią zmianę sobie zdejmę z powrotem
mamy wszystko.
Mój plik index html oraz mój plik podstawy HTML zobaczmy teraz stash list masz tylko jedną zmianę dlatego
że ostatnie zmianę zdjęliśmy wykonam jeszcze raz to polecenie co ostatnio wykonam je także z opcją
minus u albo właściwie te podstawy możemy na razie sobie usunąć stąd po prostu zapisze sam indeks ale
tym razem tutaj podam message czyli bezpośrednio na końcu tylko save nie możesz zrobić samej tutaj wiadomości
spis treści nie możesz zrobić tego polecenia bez save.
W ten sposób byłoby ryzyko że git rozpoznałby tutaj np. nasz opis przypadkiem jako polecenie i żeby
tego uniknąć albo robię dokładnie save i podaję nazwę np. spis treści albo robię po prostu git stash i wtedy
nazwą się nie przejmuje git wtedy tworzy tą nazwę za mnie i teraz zobaczmy git stach list i tym razem widzisz
mam znowu dwie zmiany ale tym razem moja ostatnia czyli najnowsza zmiana z numerkiem 0 też informacja
jest on master czyli z jakiej gałęzi robiłem tą zmianę ale mam te informację moją czyli zamiast tutaj
ją dodałeś automatycznie jak widzisz poniżej opis ja mogę tu wcześniej dowolny opis który będzie mi mówił dokładnie
jakie zmiany się w tym miejscu znajdują.
Przywrócę jeszcze raz git stash pop
i może się tak zdarzyć że chciałbym jakby część tylko zmian zachować jak już widziałeś wcześniej nie korzystając z
polecenia u.
Pozostawiam wszystkie nieśledzone.
Zmiany w tym miejscu czyli zostają tylko te zmiany dodane.
Jeśli np. dodałbym mój index HTML zróbmy git add.
I dodam indeks HTML do indeksu czyli jak już wiesz on jest teraz na zielono jest przygotowany do scommitowania
to w tym momencie polecenie git stash zapamięta te zmiany i je zestashuje także ten plik Index HTML.
Jeśli jednak zrobię git stash i poda opcję keep index to taka opcja zostawi tutaj indeks
pozostawił indeks jedyne co ten stash próbował zabrać tu są wszystkie zmienione pliki git stash list
i żeby podejrzeć dokładnie co w tych zmianach się znajduje.
Możesz także wykonać polecenie git stash show.
Czyli jeśli ich bardzo dużo i wszystkie mają te automatyczne nazwy bardzo łatwo się pogubić.
Na szczęście ja mogę podać powiedzmy w ten sposób
ok.
Czyli jak widzisz on zapamiętał plik index.
W tym naszym stashu ale jednocześnie pozostawił mi ten plik dalej do pracy.
Czyli chcę żeby sobie taką tymczasową kopię lub tylko skopiować zmiany gdzieś indziej i przenieść je w
stashu.
Także możesz zrobić opcję keep index tutaj jak przed chwilą albo w skrócie po prostu k i to pozwoli tobie zachować
zmianę do stasha i zostawić je w indeksie żeby faktycznie scommitować na tym branchu a potem np. przenieść zmiany
na inny branch.
Czyli tak spróbujmy zrobić tak żeby to tutaj zostało ok.
Ta ostatnia zmiana nie jest potrzebna.
Nie będę tym razem zrobił gip pop bo te zmiany już mam.
Jeśli po prostu chce usunąć zmiany robię git stash drop i podobnie jak przy git stash show po prostu wklejam
ten sam identyfikator.
Może nie aż tyle tylko sam tylko numer i w ten sposób usuwam zrzucam usuwam zmiany z ostatniego stasha jeśli usuniesz
ten sposób zmiany dość ciężko je z powrotem przywrócić.
Ja tu już nie będę wchodził w szczegóły po prostu śmiało dodawaj rzeczy na pewno masz je gdzieś scommitowane
dopiero wtedy czyjś stash.
Nie usuwaj zmian ze stasha wcześniej dopóki nie masz pewności że wszystkie zmiany są tam scommitowane.
Pamiętaj że zawsze możesz użyć polecenia git stash show żeby podejrzeć co tam się dzieje.
Więc jeszcze raz zobaczymy jak to wygląda git status mamy tu wszystkie zmiany w stashu
mamy tam jeszcze tą ostatnią zmianę już sobie ją podejrzę czyli muszę tutaj skopiować lub przepisać identyfikator tego
ostatniego stasha i z opcją jeszcze v.
Niekoniecznie dużą tak opcja v jest verbose czyli pokazuje mi dokładnie jakie zmiany zostały kiedy wprowadzone
w których plikach ok i teraz tak chciałbym te wszystkie zmiany które tu mam przenieść na inny branch.
I oczywiście mógłby być po prostu git checkout minus b i podać brancha np. spis treści.
I takie coś przeniesie mnie na nowy branch razem ze wszystkimi zmianami.
Tak to będę mógł scommitować zupełnie na innym branchu.
Ale jeśli powiedzmy ten branch już istnieje to nie mogę tego zrobić.
Oczywiście spis treści też jeszcze nie istnieje byśmy mogli go utworzyć.
Nawet mogę przełączyć się jak zobaczysz jest ten git status jestem na branchu spis treści ale najfajniejszą
rzeczą w stachu jest to że jeśli już branch istnieje master spis treści nowy nagłówek ja mogę wszystkie
rzeczy które tu mam zrobić kit stash save mogę wziąć niezmienione zmiany indeks chce zabrać ze sobą i
zrobimy tak nazwa spis treści ok i teraz przełączę się na mastera
git stash list tutaj mam cały czas dostęp do wszystkich tych zmian.
Czyli mógłbym tutaj na masterze tu je rozpakować np git apply.
Mogę się przełączyć też na inny branch z powrotem.
Git checkout
spis treści jak widzisz mogę się swobodnie przełączać się między tymi gałęziami między tymi branchami dlatego że
tu żadne zmiany nie kolidują.
Zmiany leżą sobie z boku ja mogę zaaplikować nasze zmiany na dowolnym dowolnej gałęzi lub nawet korzystając
nie z polecenia pop tylko apply mogą te same zmiany zaaplikować i scommitować na kilku gałęziach ja już zrobiłem to na jednej gałęzi
czyli tutaj będziwe spis treści zrobimy git.
Stash apply
OK.
Zrobię oczywiście git add index podstawę może zostawimy na razie zrobimy git commit
spis treści i tu jeszcze dodam informację Work in Progress żebyśmy wiedzieli że to jest niedokończony
spis treści zrobimy jeszcze git add podstawy git commit
podstawy HTML także robimy Work in Progress czyli tu straszny bałagan robi mi się na tej gałęzi git log.
Mamy tutaj ogromny bałagan mamy dwa niedokończone commity ale jak pamiętasz z poprzednich lekcji nie
będzie żadnego problemu z tym dlatego że dokładnie już wiesz jak cofnąć się w historii.
Jak używając polecenia reset checkout revert itd możesz spokojnie modyfikować historię i wszystkie
dane które tu wprowadzimy.
One zupełnie nie miały wpływu na gałąź master.
Nawet gdybym zmodyfikował by te commity to te zmiany by istniały tylko w tej gałęzi.
Master cały czas miałby swoją oryginalną historię.
Ok.
Więc ja tutaj te zmiany zostawię mogę teraz spokojnie zrobić git checkout i przełączyć z powrotem na
mastera.
Mamy czystą historię natomiast git log oneline jak widzisz nie ma tutaj ani informacji o naszym nowym nagłówku ani
nie ma informacji o naszym spisie treści.
Czyli widzisz w ten sposób ja mogę równocześnie pracować na wielu różnych zmianach na różnych tematach
i nie muszę ich mieszać muszę ich plątać ze sobą w kolejnych lekcjach zobaczysz jak wybierać zmiany z jednej
gałęzi umieszczać je na drugiej lub jak całkowicie łączyć ze sobą dwie gałęzie na przykład żeby nasza strona
w końcu miała nowszy nagłówek żeby miała spis treści i żeby zintegrować w jednym miejscu.
W tym momencie jednak jesteśmy stashu pokaże jedną rzecz git stash list jak widzisz tutaj mamy właśnie te
zmiany jak pamiętasz ja przed chwilą te zmiany scommitowałem.
I ja wiem że one są bezpieczne bo git branch.
Mamy tutaj tutaj spis treści.
Jeśli dam jeszcze opcję v mamy informację właśnie że tutaj na pewno te zmiany są więc w tym momencie
mogę swobodnie zrobić git stash clear i polecenie git.
Stash clear wyczyści mi wszystkie zostawione zmiany tutaj więc po takich operacjach przenoszenia zmieniania
zapamiętywania odkładania z powrotem już na pewno masz te zmiany gdzieś zapamiętane i masz scommitowane
są bezpieczne.
Możesz śmiało zrobić git stash clear i wyczyścić wszystkie tymczasowe zmiany które miałeś OK.
W kolejnych lekcjach zajmiemy się przenoszeniem już commitów pomiędzy gałęziami.
Ale to już w kolejnych lekcjach.
Dziękuję i do zobaczenia.