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 poznałeś polecenie git push.
Pozwalała nam ona dowolną referencje czy dowolny id commita gałąź etykietę wysłać z lokalnego repozytorium
na zdalne repozytorium wraz ze wszystkimi obiektami potrzebnymi do odtworzenia drzewa np. na tym zdalnym
repozytorium.
W tej lekcji pokażę ci polecenie git fetch i git pull i służą nam one do i służą one do dokładnie przeciwnej
operacji czyli do pobrania danej referencji z jakiegoś zdalnego repozytorium wraz ze wszystkimi obiektami
i referencjami potrzebnymi właśnie do odtworzenia struktury pliku struktury katalogów u nas lokalnie
w naszym katalogu roboczym w naszej jakiejś gałęzi w naszym lokalnym repozytorium.
Ja tutaj na naszym git hubie pozwoliłem sobie dodać jeden dodatkowy commit tutaj jeśli wejdziemy w commity na gałęzi
master tutaj jako inny użytkownik stworzyłem dodatkowy commit który znowu usuwał ten plik testowy jednak ten
commit tutaj jak zobaczymy sobie tu git log
on tutaj nie istnieje.
Tutaj mamy testową treść dodaną do pliku test.
Ja ten commit w którym go usuwam on tutaj jeszcze nie istnieje nie pobrałem go i teraz możemy to robić
na dwa sposoby.
Mogę do tego wykorzystać polecenie git fetch oraz git push.
Zaczniemy od polecenia git fetch i tutaj git fetch przyjmuje tutaj adres do repozytorium.
Ja jako że mam to repozytorium skonfigurowane.
Złożymy sobie git remote z opcją v.
Mam ten adres już zapisany w naszej konfiguracji więc nie muszę go podawać mogę podać git fetch origin.
I tutaj to pobierze nam wszystkie informacje z zdalnego serwera origin do odpowiednich jak pamiętasz lokalnych
folderów czyli w katalogu kropka git.
Tam mieliśmy refs mieliśmy refs nasze heads czyli refs lokalne referencje ale mieliśmy także remotes czyli referencje
zdalne.
I tutaj udało się pobrać jeden obieg.
Prawdopodobnie jest to ten nasz dodatkowy commit.
Tutaj jak widzisz pobrał do origin master.
I takie zmiany są dostępne w dwóch miejscach mianowicie tutaj.
Jeśli zrobię ls to właśnie cat git refs remotes origin master.
Tu mamy hash do tego nowego commita i jeśli go sobie go podejrzę tutaj go
przekopiuejemy git show
oneline.
Przekopiujemy ten hash i to jak widać jest to commit usuwam plik test czyli dokładnie ten nowy mój dodany który tu jeszcze kopiujemy ten hash.
Jeszcze nie było czyli to polecenie pobrało ten commit ale nasz master git log
tutaj się jeszcze nie zmienił.
Czy jak zobaczysz polecenie git fetch pobiera zmiany ale pobiera te nasze referencje do osobnego
katalogu do katalogu remotes nazwa naszego zasobu i tam nazwa referencji np. tutaj jest to master nasze oryginalne
refsy czyli refs heads master.
Tam gdzie jesteśmy teraz się nie zmieniły.
Teraz dodatkowo jeszcze tutaj mamy taki plik który nazywa się fetch head i jeśli zrobię to samo git
show.
I tutaj zastosujemy może inaczej cat git fetch head to tutaj mam informację co zostało pobrane co zostało
ściągnięte został pobrany branch master z tej strony tutaj oraz został pobrany branch test dlatetgo że wpisałem
po prostu polecenie git fetch samo ono pobrało wszystkie gałęzie wszystkie informacje z tego serwera.
Oczywiście możemy też pobrać informacje pojedynczo ponieważ git fetch head pozwala Tobie bardzo łatwo dostać
się do tego co zostało pobrane czyli nie musisz szukać tego w katalogu właśnie tutaj refs.
Remote nie musisz tego pamiętać wystarczy tutaj że wykorzystasz ten fetch head czyli jeśli chcielibyśmy tutaj pobrać
powiedzmy tylko gałąź master to jeszcze spróbuje git fetch origin i tym razem piszemy master możemy pobrać tylko
tą jedną gałąź ok.
Teraz pobrany master zwróć uwagę że master został pobrany do fetch head ja teraz i podejrzę jeszcze raz sobie fetch head i
tutaj widzisz mam już tylko jeden commit oczywiście tutaj git fetch może coś w inny sposób mogę podać np. git fetch origin master
do np. temp.
I tym razem zwróć uwagę że ta referencja została pobrana ale powstała już do konkretnej gałęzi jeszcze raz zrobię
branches
git branch tutaj powstał nowy nowa gałąź temp.
Ja przecież wskazuje na dokładnie ten jeden nowy pobrany commit i mógłbym taką nową gałąź zmerge'ować do
mastera tak żeby tutaj się pojawiła.
Ona w gałęzi master żeby gałąź master była na bieżąco z origin master bo w tym momencie zwróć uwagę że
jest tu informacja że gałąź master jest jeden do tyłu za źródłem czyli jeżeli wpisze git status widzimy
że jesteśmy jeden do tyłu za masterem i właśnie mówiliśmy.
Git pull i co robi git pull git pull robi dokładnie to co gdybyśmy zrobili git fetch origin master lub samo git fetch pull.
Jeśli mamy tutaj skonfigurowany tracking czyli nasz master je skonfigurowany.
Jak widziałeś w poprzedniej lekcji żeby komunikować się zsynchronizować z daną gałęzią master
git fetch pobrało mi najnowsze zmiany.
Teraz tutaj w tym pliku naszym fetch head jest najnowsza informacja o masterze i teraz mógłbym zrobić tak git fetch teraz w tym pliku
origin master żeby tylko master pobrać tu mamy head i co mamy zrobić to git merge
fetch head i jak widzisz ja nie muszę szukać dodatkowego brancha.
Ten tmp nie był mi potrzebny.
Nie musiałem jakoś gdzieś specjalnie wydobywać tego hasha po prostu korzystając z polecenia git merge
i podając informację fetch head git sam pobierze ostatni pobrany commit ostatnią pobraną referencje fetchem
i zmergeuje mi do mastera podając tu jak tu widzisz jest to kilka kroków.
To wszystko może być prościej i szybciej ja tutaj cofnę mastera o jeden czyli git reset
cofnę się o jeden commit do tyłu teraz jesteśmy na tym commicie na którym byliśmy i git status pokaże nam jesteśmy
o jeden do tyłu i teraz za polecenia git lecz pobierania tego do osobnego pliku tego samego brancha
tych najnowszych zmian zamiast merge'ować je potem z powrotem do mastera mogę te wszystkie kroki wykonać
za jednym razem wziąć git pull i pull podobnie mogę podać skąd gdzie mam pobrać itd.
Ale jednocześnie mogę podać wszystkie parametry dla merge'a czyli to co podawałem przy fetchu mogę zastosować
to tutaj czyli np. skąd dokąd.
Tutaj ale także mogę podać wszystkie inne opcje dla merge'a np. rebase itd.
Do tego jeszcze wrócimy.
Tutaj jako że znowu tę gałąź do branch master jest skonfigurowana by automatycznie wykonywać pulla adresy są skonfigurowane
jako tracking jako set upstream.
Ja po prostu wykonując polecenie git pull mogę zaktualizować tą gałąź czyli zaciągnąć z śledzonej gałęzi
zdalnej wszystkie zmiany i automatycznie je zmerge'ować do tej gałęzi która ma ustawione śledzenie z tą
znaną gałęzią.
Podobnie jak przy wysyłaniu zmian lokalnych na serwer tak samo przy pobieraniu zmian zdalnych na lokalne
repozytorium mogą pojawić się konflikty i tutaj ja tego mastera git
wycofam o jeden jak widzisz mam ten branch temp origin master master wszystkie trzy są teraz w tym samym miejscu jakbym się cofnął o
jeden czyli git reset hard cofnę się o jeden commit i teraz jesteśmy jeden do tyłu czyli git status znowu jeden
tu za tą zdalną gałęzią pobraną origin master.
I tym razem nie pobiorę zmiany.
Spróbuję zrobić inny commit który znowu jakoś będzie mi tutaj wchodził w kolizję z tym nowym czyli zrobić
tutaj powiedzmy znowu echo test
do pliku test txt i git commit.
Dodajemy zmiany dodajemy message.
Testowa treść pliku test.
Ok mam teraz jeden commit zobaczmy git lock.
Jesteśmy jeden do przodu.
Teraz zobaczymy git status o i teraz zobaczmy informację że nasz branch master i gałąź origin master tu
się rozwidliły siłę każda poszła w inną stronę.
Mamy dwie różne gałęzie i widzisz polecenie git pull zmerge'uje te gałęzie i spróbuje rozwiązać konflikty.
Zobaczmy czy git pull uda mu się to zrobić automatycznie za nas mamy konflikt.
Jak pamiętasz z lekcji na temat merge'owania.
To jest tak samo.
Pamiętaj że o tym że powiedzenie git pull tak naprawdę wykonuje dwa polecenia wykonuje git fetch który
pobiera nasze zmiany i przechowuje wskaźnik w katalogu kropka git refs remote.
I w tym miejscu nie zmienia lokalnych żadnych referencji.
Następnie powiedzenie git pull wykonuje za nas merge'a klasycznego zwykłego merge'a który stara się
te zmiany zaaplikować w naszym lokalnym repozytorium i przesunąć lokalny wskaźnik do przodu na tego najnowszego
commita.
Może być to merge fast forward gdy możemy po prostu przesunąć wskaźnik na najnowsze commity.
Jeśli historia się często łączy jeśli wymaga tutaj jakichś rozwiązywania konfliktów czy to automatycznych
czy ręcznych no to mamy taką dokładnie samą sytuację jak przy merge'owaniu.
I oczywiście tutaj ten merge działa dokładnie tak samo jak poprzedni merge możemy polecenia wszystkich
których korzystaliśmy przy merge'owaniu budować tutaj bezpośrednio po pullu.
Jednym z nich między innymi będzie git pull z flagą rebase który jak pamiętasz z poprzednich lekcji pozwoli
nam zaaplikować najpierw zmiany z serwera a później ponownie zaaplikować wszystkim nasze dokonane dotychczas
zmiany jeśli potrzebujesz jeszcze lekcji z rebase'em to polecam do niej powrócić dlatego że jest to ważne żeby zrozumieć
kolejną lekcję ja tutaj cofnę te zmiany i w kolejnej lekcji zajmiemy się już git pull rebase.
Do zobaczenia.