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 poprzedniej lekcji udało nam się zainstalować gita uruchomić konsolę terminal git bash którą teraz widzisz
oraz skonfigurować nasz git config.
W tej lekcji jeszcze nie zaczniemy pracy z właściwym gitem z właściwymi poleceniami dlatego że chciałbym ci najpierw
pokazać w jaki sposób działa git z czego się składa jakby w środku jak proste matematyczne zasady pozwalają
na wszystkie magiczne rzeczy które dzieją się w gicie.
Polecenia gita możemy podzielić na dwie grupy.
Są to polecenia porceline i polecenia plumbing i te porcelanowe polecenia jakby to nazwać.
Są to właśnie takie eleganckie proste zrozumiałe w użyciu normalnej codziennej pracy są bardzo wygodne
bo pozwalają jednym poleceniem wykonać wiele kroków wiele operacji i osiągnąć od razu efekt którego
potrzebujemy w gicie działamy ręcznie musimy wziąć stąd przełożyć tam poprawić zmienić przesunąć te wszystkie
rzeczy robią polecenia typu plumbing po polsku będzie to po prostu hydraulika czyli tak jak jedziesz
samochodem i nie musisz zaglądać na co dzień pod maskę.
Tak samo z gitem na co dzień korzystasz z wygodnych po prostu kontrolek.
Z wygodnych poleceń.
Natomiast te polecenia pod spodem wykonują właśnie te niskopoziomowe polecenia typu plumbing.
W tej lekcji pokażę ci polecenia z których na co dzień nie będziesz korzystał.
Nie jest istotne żebyś zapamiętał polecenia z tej lekcji w tej lekcji.
Ważne jest żebyś zrozumiał zrozumiała koncepcję jak git działa z czego się składa w jaki sposób przechowuje
swoje dane i w jaki sposób pozwala nam te dane wyciągnąć odzyskać.
Zapisać i przełączać się pomiędzy różnymi wersjami naszych plików.
Jeśli uda ci się zrozumieć i wyobrazić operacje które będę wykonywał w tej lekcji będzie tobie dużo dużo łatwiej
później gdy będziemy robić dużo bardziej skomplikowane operacje musimy zmieniać wiele plików.
Wiele wersji w wielu różnych miejscach będziesz mógł sobie bardzo łatwo w głowie to poukładać.
Zobaczyć jak poszczególne rzeczy gdzieś tam pod spodem git sobie układa.
Żeby osiągnąć efekt ok przejdźmy więc do przykładu na początek zwykły pusty katalog może nie pusty mam
tylko jeden plik plik txt w pliku txt.
Na razie to faktycznie jest pusto i w tym katalogu.
Jak działa tutaj utworzę nowe repozytorium gita.
Git żeby działać potrzebuje katalogu i w tym katalogu utworzę sobie po prostu ukryty folder i zrobię git init ten
cały folder jak działa stał się teraz repozytorium i wszystkie pliki wszystkie dane znajdują się tutaj w katalogu
kropka git.
Pierwszy raz tutaj wyświetlę tak się w ten sposób jak widzisz mam ukryty katalog kropka git normalnie nie
widać i nasz plik txt teraz jeśli wprowadzę zmiany w tym pliku txt i będę zapisywał commitował
te zmiany.
Poszczególne wersje tego pliku będą tutaj ukrywane w tym katalogu git.
Po to żebyś tutaj potrzebował któreś ze starszych wersji żebyś mógł łatwo przywrócić z powrotem do głównego katalogu.
Nim jednak zajmiemy się przywracaniem zobaczmy w jaki sposób git przechowuje ten sam plik.
W wielu wersjach no i nie myli się przy tym który jest który może w bardzo łatwy i błyskawiczny sposób
odnaleźć poszczególne wersje naszych plików a nawet wersje całych katalogów pokaże Ci jedno polecenie
będzie to git hash object i przekaże ścieżkę do naszego pliku czyli nasz plik txt.
Jeśli w naszym pliku znajduje się teraz nic wpiszmy powiedzmy tutaj plik
tak wygląda skrót matematyczny sh z naszego pliku txt.
Czyli cała zawartość pliku została skonwertowana na taki ciąg znaków teraz możesz zapisać ok.
Skoro mam tu tylko cztery literki dlaczego jest tak długo.
O to chodzi że tutaj ten ciąg znaków ma zawsze podobną taką samą długość.
Ale jeśli zmienię tylko jeden znak jedną literkę w naszym pliku zostanie wygenerowany inny unikalny ciąg
znaków więc wezmę sobie tutaj plik 2.
Na przykład nasza druga wersja.
I zapytam gita jak tam widzisz powstaje tutaj zupełnie inny hash czyli zupełnie inny skrót matematyczny.
I tutaj jest bardzo mała bardzo bardzo mała szansa na to że taki plik się powtórzy.
Miliony plików i nadal byłaby prawie żadna bardzo znikoma szansa na powtórzenie.
Jak widzisz taki długi ciąg symboli sprawia że mam unikalny identyfikator każdego obiektu jaki stworzyłem.
Jeśli wykonałem takie polecenie drugi raz dostanę identyczny hash dlatego że ten plik się nie zmienił.
Czyli w ten sposób widzisz mogę łatwo zidentyfikować który to jest plik.
Czy on się nie zmienił i na pewno tutaj ani literka ani jeden znak tutaj nie jest inaczej niż był poprzednio.
Ok w takim razie jeśli to służy do identyfikowania obiektów czym w gicie są obiekty jeżeli zajrzymy do katalogu który git mi stworzył.
Git ma kilka różnych folderów m.in. jak widzisz jest to katalog objects.
Mam tutaj info i pack w katalogu info mamy pusto w katalogu pack mamy pusto.
Aby utworzyć obiekt ja tutaj wykonam nasze polecenie.
Jeszcze raz nasz object ale teraz mamy opcje w i opcja w zapisze taki obiekt do naszego repozytorium.
Czyli tutaj jeszcze raz jak wykonam objects.
Jak widzisz już powstał folder 47 teraz dlaczego 47.
Jak widzisz początek.
Pierwsze dwa trzy znaki tego całego tutaj ciągu lądują w folderze.
Chodzi o to że z takich obiektów możesz mieć bardzo bardzo dużo żeby nie mieć folderu z dziesiątkami tysięcy takich
różnych plików.
Git tworzy katalogi i dzieli po prostu grupuje te wszystkie obiekty według pierwszych dwóch liczb żeby łatwiej
było mu wyszukać odpowiedni plik i teraz jak podajesz sobie taki plik.
Nie ls tylko cat.
Zobaczmy zawartość takiego pliku.
Jakieś dziwne symbole a dlatego że jest to plik zapisany w postaci binarnej.
I dzięki temu git jest w stanie bezpiecznie przechowywać zdjęcia filmy obrazy jakieś nasze aplikacje
bez ryzyka ich przypadkowego uszkodzenia.
Teraz jak taki plik odczytać pliki będziemy zapisywać polecami gita tak jak widziałeś przed chwilą object hash ale
także odczytywać zmieniać modyfikować wprowadzać zmiany tylko przy użyciu narzędzi gita.
Czyli także tutaj jeśli chce zobaczyć zawartość któregoś obiektu robię git cat file dodaję tutaj
p i podaje już nie samą ścieżkę do tego pliku jak poprzednio będzie potrzebny tylko sam ten numer czyli
tak zwany hash.
Jego sobie tutaj wkleję.
Ok 35.
Jeszcze początek 47.
Nazwa katalogu i jak widzisz z powrotem zawartość mojego pliku.
Plik 2.
Jeśli teraz stworzę kolejną wersję pliku czyli przejdę tutaj do naszego katalogu plik 3.
Jeszcze raz zrobimy tutaj tak jak poprzednio hash object plik z opcją w czyli w zapamiętaj jak widzisz mam znowu
kolejny identyfikator.
Teraz jeśli zajrzymy znowu do katalogu git objects to mam tutaj dwa foldery czyli jak widzisz każda zmiana nawet jednej literki
będzie mi tworzyła nowy obiekt i tutaj jeśli damy do objects i spróbuje ten obiekt sobie podejrzeć czyli git cat file i skopiuje
ten cały identyfikator to jak widzisz mam zawartość plik 3 czyli każda zmiana nawet jednej literki tutaj
jeśli ją zapisze w gicie utworzę obiekt z unikalnym identyfikatorem po którym będę mógł bardzo łatwo przywrócić
sobie kolejną wersję.
Oczywiście to nie będzie łatwo bo tu nie chciałbyś pamiętać takich długich nazw do tego służyły narzędzia
które poznasz w kolejnych lekcjach.
Tutaj tylko chciałbym żebyś zapamiętał że każda zmiana nawet najmniejsza tworzy nowy matematyczny skrót który jest unikalny
i dzięki temu każda zmiana jest przechowywana w osobnym dokumencie i gdybym chciał np. przywrócić wcześniejszą wersję
pliku.
Mogę tutaj przy tym git cat file pobrać sobie powiedzmy tutaj wcześniejszą wersję np. plik 2 i zapisać jako plik
txt przejdę do edytora i mamy plik w wersji 2.
Czyli w ten sposób mam dokładną wersję każdego pliku i jego spójność jest zawsze potwierdzona takim matematycznym
skrótem.
Pytanie teraz jak przechowywać kilka plików jak przechowywać katalogi i ścieżki bo jak widzisz w ten sposób.
Tutaj zgubiłem nazwę plik txt.
Git zupełnie usuwa tutaj jak widzisz nazwę ścieżkę zostawia tylko treść.
Jest to o tyle fajne że masz kilka plików które zawierają dokładnie tę samą treść.
Git przechowuje tylko raz tutaj traciliśmy jednak ścieżkę.
A jak pamiętasz git przechowuje nie tylko pojedyncze pliki ale całe ścieżki całe katalogi
całe migawki całego naszego projektu katalogu czyli zmienimy kilka plików możemy zapisać je jako taką
migawkę czyli commit tutaj pokaże ci jak przygotować sobie pliki.
Czyli jeśli tutaj mamy nasz hash jakiegoś pliku powiedzmy tutaj plik 2 i chcieliśmy go zapisać do takiej migawki
to migawka składa się z drzewa które to określa w których miejscach były które pliki w których wersjach
i najprościej takie drzewo ułożyć w taki sposób że przygotowujemy indeks czyli taki szkic migawki.
Indeks to jest pliki które są już zapisane w naszych obiektach ale nie są zapisane w naszej historii jeszcze
bo jak widzisz nie mają ani katalogu ani daty ani autora ani nazwy.
Czyli git update.
Indeks tworzymy indeks dodamy plik
tutaj.
Tak jak mówiłem tych poleceń na co dzień nie używasz więc nie staraj się zapamiętywać takich symboli dlatego
że w dalszych lekcjach nie będziemy już korzystać.
Takie polecenia będą za ciebie wykonywane automatycznie tutaj tworzymy takie nowe drzewko dodajemy plik tutaj jest
unixowy po prostu kod z prawami dostępu prawami zapisu do takiego pliku.
Jak pamiętasz pod tym hashem znajduje się tutaj nasz plik ale bez ścieżki.
I teraz żeby zapisać w którym miejscu plik się znajdował w danej wersji tutaj dopisze na przykład plik kropka
txt.
Czyli tutaj na końcu podaje ścieżkę i mogę w ten sposób do indeksu dodać kilka różnych plików.
Czyli przygotować migawkę pliki w momencie dodawania do indeksu.
One już są obiektami już są zapamiętane więc ich już nie stracisz ale możesz jeszcze stracić ścieżkę.
Miejsce w którym ten plik się znajdował.
Dlatego przed commitem przed migawka musisz wybrać pliki i katalogi które chcesz dodać.
Będzie to bardzo łatwe polecenie git add którym podasz po prostu pliki.
I to pozwoli nam utworzyć drzewo.
Spróbujmy zobaczyć git write tree czyli i powstał kolejny obiekt.
Ten obiekt jednak nie przechowuje po prostu pliku ale podejrzymy go sobie poleceniem git cat
minus p.
Zobaczymy obiekt plik który zawiera tutaj kod to jest atrybut dostępu do pliku unixowy blob.
Dlatego że ponieważ jest to plik binarnie zapisany jego identyfikator i ścieżkę w którym on był miejscu.
I teraz jeśli mam plik z jego hashem. Jeśli mam tree czyli plik który rejestruje strukturę katalogów
i plików które były w danych lokalizacjach w danym momencie to mogę z tego stworzyć migawkę.
Czyli stworzyłem pliki dodałem je do indeksu z indeksu zapisałem sobie taki tutaj listę plików a następnie
mogę stworzyć migawkę czyli commit zapamiętam tylko tutaj hash naszego drzewa będzie ono potrzebne
i tutaj wykonuje polecenie git commit tree podaję tutaj hash naszego drzewa a następnie dodaje
message.
Dlaczego to jest ważne.
Pamiętaj że pliki są zapisywane tylko i wyłącznie po tych hashach.
Czyli bardzo trudno byłoby nam odnaleźć który znajduje się gdzie struktura katalogów struktura plików
zapisywana jest właśnie w takim pliku drzewa i ten plik drzewa jest tak zapisywany jako hash i ciężko go
odnaleźć.
Które to było drzewo która była wersja po tym samym hashu.
Hash pamiętaj gwarantuje spójność.
Jeśli którykolwiek plik się zmieni jego hash się zmieni i ja będę o tym wiedział.
Jeśli struktura katalogów się zmieni lub którykolwiek z plików w tych katalogach to cały plik drzewa też
musi się zmienić bo pamiętaj przecież wystarczy jedna litera czy identyfikator jakiegoś pliku się zmieni czy
jego ścieżka całe drzewo się zmieni.
Tylko jednak sam identyfikator o ile jest wygodny.
Tutaj bardzo łatwo wyszukać jak widziałeś pliki.
Bardzo łatwo porównać czy się zmieniły.
Tak jest bardzo niewygodny dla nas jako autorów.
Dlatego każdy taki zbiór zmian żeby się nie pogubić opisujemy takimi messegami i te messege są ważne bo
one pozwolą nam przypomnieć sobie do czego dotyczyła zmiana.
Mieliśmy na przykład sto plików nie muszę przepisywać każdego.
Ja po prostu opisuję tutaj zmieniono zmieniono plik txt na nowy.
Jeśli wykonam to polecenie dostaję tutaj znowu hash i teraz taki hash możemy sobie podejrzeć znowu git cat file.
I tu jak widzisz mamy informacje o tym które drzewo plików.
W której wersji.
Kto je zapisał kto jest scommitował.
Tutaj są daty kiedy dokładnie to się stało i opis zmieniono.
Plik txt na nowy.
Czyli jak widzisz każda zmiana w kodzie składa się z commita.
Commit jest tylko plikiem wskazującym na plik określający strukturę plików który to z kolei wskazuje na.
Poszczególne wersje tych plików zwróć uwagę że jeśli którykolwiek z tych plików się zmieni to zmieni
się drzewo.
Jeśli drzewo się zmieni to zmieni się też jego hash.
Jeśli hash się zmieni to zmieni się także hash naszego commita i zmieni się autor.
Jeśli zmieni się data dostajemy zupełnie inną cyferkę.
Dzięki takiemu matematycznemu podpisywaniu git jest bardzo bezpiecznym a także bardzo szybkim
systemem do pracy do wymiany informacji.
I oczywiście takie zestawy commitów będziesz mógł umieścić na danym serwerze wysłać skopiować do kolegi.
Takie zmiany będziesz mógł wycofać np. będzie można wybrać sobie wcześniejszy plik odczytać jego zawartość
i przywrócić do katalogu tym wszystkim zajmiemy się w kolejnych lekcjach.
Mam nadzieję że cię nie przestraszyłem tymi wszystkimi poleceniami dlatego że w kolejnych lekcjach będzie
to wyglądało nieco prościej.
Git status pozwoli mi sprawdzić czy mam tutaj jakieś pliki git add plik txt.
Doda czyli pamiętasz stworzy po kolei wszystkie hashe tych wszystkich commitów.
Stworzy nam całe takie drzewko z zapisem struktury całego naszego katalogu.
I oczywiście git commit zmieniono
plik stworzy nam commit który będzie miał jakiś hash i ten hash możemy sprawdzić
korzystając z polecenia git log.
Czyli jak widzisz te wszystkie niskopoziomowe operacje będziesz mógł krótko wykonać.
Prostymi operacjami wysokiego poziomu i tutaj jak widzisz mamy także hash mamy tutaj adres e-mail i mamy tutaj
zmiana pliku.
Oprócz obiektów git przechowuje tutaj tak zwane referencje.
Jak widzisz tutaj mamy head i master i to są referencje i referencje są plikami które przechowują
jakiś commit.
Po to żebyśmy nie musieli pamiętać takiej długiej nazwy tylko jeśli chce powrócić do jakiejś wersji
albo przyłączyć na jakąś wersję.
Nie muszę znać identyfikatora wystarczy że znam jego referencje czyli na przykład jeśli zrobimy sobie podejrzę
powiedzmy cat git head jak widzisz plik head wskazuje na refs head master.
Jeśli podejrzę sobie plik
refs heads master to jak widzisz wskazuje on na jakiś hash i poleceniem git show mogę zobaczyć
że to jest nasz ostatni commit mam już dużo prościej bo wystarczy zrobić git show master.
Mam ten sam efekt jeśli zrobię git show head mam ten sam efekt chciałbym żebyś z tej lekcji zapamiętał że każda
zmiana powoduje stworzenie obiektu który ma swój matematyczny skrót czyli takiemu matematycznemu skrótowi można
łatwo porównać obiekty które się zmieniły.
Można też łatwo odszukać struktura katalogów i plików po prostu jest tak zachowana jako po prostu plik ze
ścieżkami i wskazaniami na poszczególne wersje plików.
Natomiast commit to jest taka podpisana opisana zmiana migawka która także jest obiektem także ma swój
skrócony hash i tymi hashami operuje git.
My natomiast dla naszej wygody opieramy takimi etykietami czyli referencjami które po nazwach pozwalają
nam się odnieść do tych zapisanych tutaj hashów żeby odzyskać nasze commity.
Nasze drzewa struktury plików czyli już poszczególne pliki gdybyś chciał podejrzeć jakieś nasze pliki przywrócić jakieś starsze
pliki zobaczysz w kolejnych lekcjach że nie będziesz musiał w ogóle korzystać z tych identyfikatorów zupełnie wystarczą
mi do tego po prostu poszczególne nazwy tak zwane referencje.
To tyle jeśli chodzi o to jak działa git.
Mam nadzieję że teraz mniej więcej wiesz co się dzieje w środku i w kolejnych lekcjach zobaczysz jak
ten prosty ale ścisły matematyczny mechanizm pozwala stworzyć bardzo różne metody pracy pozwala nam
eksperymentować tworzyć nowe pliki usuwać zmieniać i nie martwić się o nic.
Dlatego że każda zmiana jak widzisz nawet jednej literki została dodana zapisana scommitowana to możesz
zawsze do niej powrócić.
To tyle jeśli chodzi o lekcję jak działa git.
Do zobaczenia w kolejnych lekcjach.