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 udało nam się utworzyć kilka osobnych gałęzi.
Mam oczywiście cały czas naszą główną gałąź master mamy gałąź z nowym nagłówkiem.
Zmieniliśmy logo i kilka styli u góry oraz mamy gałąź spis treści na której zaczęliśmy pracę nad podstroną
oraz na spisem treści.
Mamy niedokończone zmiany w tej lekcji chcieliśmy pokazać jak zmiany możesz przenosić pomiędzy gałęziami
a właściwie jak możesz dowolną zmianę wybrać obojętnie gdzie ona się znajduje lub zestaw zmian i przenieść
do aktualnej gałęzi na której się znajdujesz.
Do wybierania właśnie takich pojedynczych zmian z naszej historii służy polecenie git czy cherry pick.
I tak jak nazwa wskazuje cherry pick.
Jest to tzw. wybieranie wisienki czyli pozwoli nam to wybrać jeden lub kilka commitów dowolnie.
Gdziekolwiek one się znajdują i umieścić je w naszym aktualnym branchu czyli git cherry pick.
I tutaj muszę podać nazwę commita lub coś co je wskazuje dowolny wskaźnik na commit jak pamiętasz wskaźnikiem
może być gałąź może być etykieta to może być jakiś specjalny zapis np. mógłbym tu wpisać na przykład spis treści co
wskazywałoby na ostatni commit w tej gałęzi spis treści lub mógłbym np. wybrać sobie jakieś wcześniejsze
commity może tym zapisem albo po prostu w ten sposób mógłbym wybrać sobie jakiś commit i umieścić go
tutaj.
Może być prostszy dodam sobie tutaj nowy nagłówek.
Jak widzisz w ten sposób polecenie git cherry pick wybrało mi commit z tej gałęzi nowy nagłówek i utworzy nowy commit.
I zobaczmy teraz historię log oneline jak już widzisz commit zmieniony nagłówek pojawił mi się tutaj.
Jeśli jednak ja spojrzę sobie git show i wybiorę także ten nowy nagłówek zobaczę co tam się znajduje.
Mamy tutaj cały commit i mnie z tego całego commita interesuje jedna rzecz interesuje hash.
Zwróć uwagę że tutaj id.
Jest inny tytuł jest ten sam zmieniony nagłówek praktyczne porady ale hash jest inny czyli takie polecenie
git cherry pick wybiera dowolną zmianę aplikuje ją u nas w naszym aktualnym branchu jaki ma ustawiony.
Ale pamiętaj o tym że takie polecenie tworzy zupełnie nowy commit.
Ta sama zawartość.
Te same zmiany ale tworzony jest nowy hash z nową datą autorem itd itd.
Czyli pobierając zmiany w ten sposób ja praktycznie tworzę commit identyczny z jakimś innym commitem i tu
wybrałem akurat zmieniony nagłówek praktyczne porady i zobaczmy teraz jak była nasza historia poleceniem
git show oneline.
Tak wygląda teraz mój master.
Ja tą zmianę cofnę.
Jak pamiętasz z wcześniejszych lekcji mogę poleceniem git reset hard dlatego że chce wszystkie zmiany
usunąć i cofnąć się np. do tego momentu gdzie byliśmy przed chwilą czyli commit wcześniej oczywiście mógłbym zrobić
head i strzałka do góry albo head tylda jeden tu to jest nieistotne.
Mogę także podać commit i w tym momencie cofnę ostatnią zmianę czyli usunąłem ten nowy commit.
Chciałbym porównać tą moją gałąź ten branch na którym jestem z innymi branchami spróbujmy git log i git log ma jeszcze.
Polecenie takie jak branches i mógł podać tutaj jakiś wzorzec.
Mam tylko dwa branche więc nie podam żadnego wzorca po prostu wyświetle wszystkie także mogę użyć polecenia all.
Leciałoby to w ten sposób.
Jednak warto podać polecenie branches ono tu zawsze pozwala odfiltrować.
Branche które chcemy wyświetlić czyli jak widzimy wszystkie nasze commity na wszystkich branchach i nie
jest to bardzo pomocne dlatego że mamy tu akurat bardzo prostą sytuację mamy tylko master mamy tutaj
właśnie tutaj gałąź zmiany nagłówkiem i mamy tą drugą gałąź ze spisem treści gdzie mamy Work in Progress
więc tutaj jeszcze jesteśmy w stanie się połapać co się dzieje jednak gdy jest projekt bardziej skomplikowany.
Mamy na każdej gałęzi wiele różnych commitów i tych gałęzi robi się dużo.
Po pierwsze warto odfiltrować gałęzie a po drugie mam tu jeszcze kilka dodatkowych opcji mianowicie mogę
tutaj jeszcze dodać opcję decorate.
I tak jakoś odekoruję tutaj poszczególne elementy informacją o referencjach.
Czyli o właśnie branchach i o tagach czyli etykietach i gałęziach jak widzisz jest troszeczkę lepiej.
Nie jest jeszcze bardzo czytelnie ale mamy tylko taką informacje zwróć uwagę że jestem w tym momencie head
czyli tam gdzie akurat mamy jesteśmy ustawieni gdzie jest ustawione mastera i mamy też informacje że head który wskazuje
na master który to master wskazuje na ten commit a jeszcze dodatkowo jak pamiętasz tworzyliśmy etykietę
którą zapisaliśmy tutaj ten commit żeby nie zginął nigdzie przy jakichś modyfikacjach czyli jak widzisz ten decorate.
Opcja decorate pokazuje tutaj masę dodatkowych jeszcze informacji mianowicie gdzie te commity są zaczepione.
Tutaj jest ostatni branch przed stylami utknął tutaj wcześniej branch nowy nagłówek jest jakby jeden commit
do przodu przed naszym masterem natomiast spis treści jak widzisz jest jeszcze dwa commity do przodu tylko nie
widzę jednej rzeczy.
Ja teraz nie wiem czy ten branch spis treści czy on się wywodzi z nowego nagłówka czy wywodzi się z tego
heada tutaj tej informacji nie ma.
Dodajmy jeszcze jedną opcję graph i opcja graph wyświetla to w ten sposób ja może zrobię jeszcze bardziej przejrzyście.
I tutaj zmienimy na chwilę format na short
ok w ten sposób jak widzisz dając polecenia branches.
Decorate i graph mamy tak jakby pełne drzewko tutaj i widzimy co się dzieje czyli tak nasze tutaj zielono
czyli tu gdzie jesteśmy teraz do heada.
Jesteśmy w tym miejscu jest cała nasza historia.
Następnie tutaj od tej gwiazdki dalej na czerwono.
To są jakby inne historie które różnią się od naszych.
Jak widzisz obie te zmiany wywodzą się czyli ich rodzicem tych commitów jest wspólny commit nasz w którym jesteśmy
head master ale zwróć uwagę że tutaj mamy jakby rozgałęzienie i to oznacza że te commity i te commity one
wywodzą się ze wspólnego rodzica.
Ale żadne z nich jakby nie jest rodzicem tych pozostałych commitów i to oznacza że tutaj mamy właśnie
takie rozdroże że te zmiany idą w jednym kierunku te zmiany w innym kierunku i nam się tutaj te zmiany rozchodzą
również żeby je połączyć.
Jeśli za długo nie połączymy tych zmian no to mogą się pojawić konfliktujące różnice.
Do tego jeszcze wrócimy.
Na razie chciałbym jeszcze pokazać polecenie cherry pick gdzie teraz możemy dokładnie rozeznać się w sytuacji
i podjąć odpowiednie decyzje.
Czyli tak powiedzmy że ja najpierw jeszcze ten zmieniony nagłówek praktyczne porady czyli git.
Cherry pick i mogę użyć hasha a mogę po prostu użyć tutaj referencji.
Jak pamiętasz branch to jest nic innego tylko wskazanie na ten commit.
Więc prościej byłoby napisać mi w ten sposób ok.
Zobaczmy jak sytuacja wygląda teraz i tym razem mamy dwa odgałęzienia mianowicie zobacz że nasz head i
master znajduje się teraz tutaj całkiem na górze.
Mamy tu zmieniony nagłówek.
Praktyczne porady a te pozostałe gałęzie już zostały w tyle.
One wywodzą się z jakiejś wcześniejszej wersji czyli ja teraz jakby przekopiowaniem jedną zmianę stąd
i wkładając ją tutaj jeszcze jakby stworzyłem trzeci trzecią odrębną historię i to będzie problem bo zwróć uwagę
że ja mam dokładnie tutaj tę samą zmianę tu mam tą samą zmianę pamiętaj o tym że git cherry pick zawsze będzie tworzył
nową zmianę.
Ok spróbujmy te dwa połączyć do polecenia git cherry pick mogę też przekazać kilka commitów teraz mógłbym zrobić
to w ten sposób że przekazałbym ten commit potem ten commit.
Pamiętaj że git cherry pick czerpie właśnie tylko jeden commit na raz a właściwie tylko tę którą podamy.
Czyli jeśli podałbym tylko spis treści w ten sposób jeden commit to zwróć co się stało mamy tutaj nasz zmieniony nagłówek
dodany mam podstawy HTML dodane czyli to.
Ale ten commit nie został dodany.
Czyli ostrożnie git czerpie.
Jak widzisz wybiera tylko ten komitet który mu podałem nie pobrał tej całej historii więc ja spróbuję to zrobić jeszcze
raz.
Oczywiście git reset.
Hard head i cofniemy się o jeden do tyłu.
Sprawdźmy.
Ok nie ma tutaj zmian jeśli chcemy zaplikować tutaj.
Wiele commitów to oczywiście git.
Cherry pick mógł podać je po kolei podać najpierw ten później te i tak dalej.
Jednak w sytuacjach gdzie tu jest bardzo dużo jest tu już 20 30 zmian.
Kopiowanie ich pojedynczo byłoby bardzo zużące monotonne więc możemy robić to prościej.
Może podać zakres np. pod master albo powiedzmy head.
Obojętnie oba wskazują na to samo miejsce w którym teraz jesteśmy czyli chcę od Head przenieść wszystko.
Do tego commita spis treści i oczywiście zamiast head.
Jak pamiętasz.
Wszędzie gdzie podaję head mogę po prostu pominąć nie podając nic.
Git automatycznie domyślnie przejdzie do opcji z head jak widzisz zaaplikował sobie dwa commity tym
razem sprawdźmy jeszcze raz i teraz tak nasza historia w ten sposób że te gałęzie nasze branchy które tworzyliśmy
w poprzednich lekcjach one są tutaj z boku ale te wszystkie zmiany stały jakby ponownie zaaplikowane w
naszej głównej gałęzi head master czyli tak będzie zmieniany nagłówek stąd tutaj jeszcze raz a potem
te zmiany po kolei w tej samej kolejności czyli odtąd dotąd najpierw spis treści później plik podstawy
najpierw spis treści później plik zostały ponownie zaaplikowane.
I teraz jeśli otworzę naszą stronę to tutaj jak widzisz już mamy wszystkie zmiany zintegrowane.
Mamy zarówno nowy nagłówek mamy nasz niedokończony spis treści i wszystko to znajduje się na gałęzi
master czyli widzisz w ten sposób możesz przenosić pojedyncze commity.
Jednak jeśli faktycznie chciałbyś zintegrować jakąś gałąź czy raczej przenieść wszystkie zmiany tak jak
one są do naszego do naszej gałęzi to może to zrobić lepiej.
Mianowicie poleceniem git match o którym się będziemy mówić w kolejnej lekcji o git cherry pick.
Warto pamiętać dlatego że czasem nie chcesz całych gałęzi integrować do siebie wszystkich zmian tylko wybrać
kilka pojedynczych zmian.
Dlatego zapamiętaj git cherrypick możesz podać jedno lub zakres zmian i to stworzy jeszcze raz commity identyczne
u ciebie w twojej gałęzi.
Jednak kopiowanie commitów w ten sposób jest wadą dlatego że widzisz podwójnie mam zapisane też same informacje.
Dużo lepiej byłoby gdybym mógł te commity po prostu przypiąć sobie się podpiąć także do tego samego naszego
brancha i ta historia byłoby dużo czystsza.
Więc zróbmy tak ja wyczyszczę tą całą historię
zróbmy sobie jeszcze raz w ten sposób i chcę wrócić do tego miejsca tak jak pamiętasz.
Etykiety są bardzo przydatne żeby oznaczyć jakieś ważne punkty w historii do których np. chcielibyśmy
później wrócić i w ten sposób poleceniem git reset hard mogę się cofnąć po prostu tu nie muszę pamiętać
nie muszę szukać tego commita po prostu po tagu.
Ja wiem że pierwsza wersja była wersją oryginalną naszej strony czyli tą która nie miała ani nagłówka ani
nowego spisu treści.
Jeśli wrócę z powrotem to nasze drzewko wygląda tak jak na początku master jest tu a wszystkie zmiany są tutaj
dopiero w przyszłości są przed masterem i w kolejnych lekcjach pokażę ci jak dużo prościej i dużo sprawniej
aplikować.
Wiele różnych zmian jak łączyć te zmiany ze sobą a także co zrobić w sytuacjach gdy te zmiany właśnie
są na rozdrożu.
Gdy one zmieniają różne rzeczy a jeszcze dokładniej.
Co zrobić gdy np. dwie różne zmiany zmieniają to samo miejsce w pliku ale o tym wszystkim już w kolejnych
lekcjach.
Do zobaczenia.