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!
Tak więc wiesz już jak dodawać usuwać i przenosić pliki w indeksie tak żeby przygotować Twój idealny
commit.
Czasem jednak może się zdarzyć że masz jakieś pliki których nie chcesz indeksować w gicie chcesz żeby
git po prostu pomijał ignorował i każdorazowo pomijanie tych plików każdorazowo dodawanie wszystkiego
oprócz tego pliku jest dość męczące i też ryzykujemy taki problem że po prostu kiedyś przez przypadek
ten plik zindeksujemy i będziemy musieli go usuwać wyrzucać.
Na szczęście w gicie jest bardzo fajny mechanizm nazywa się on git ignore git ignore i jest to po prostu
plik tekstowy czyli ja mogę zrobić touch git ignore
i tutaj np. w naszym edytorze mogę podejrzeć po prostu widzisz jest to najzwyklejszy plik tekstowe on się
nie kończy kropka txt on tu kropkę na początku ma i ta kropka na początku będzie ponownie oznaczała że to
plik ukryty.
Czyli zrobię ls jak widzisz tego pliku tutaj nie ma.
LS z opcją call to jak widzisz tak samo jak git jest katalogiem ukrytym tak samo nasz plik git ignore
jest tutaj plikiem ukrytym ok stwórzmy jakiś plik powiedzmy że stworzy jeszcze jeden plik nazwę go
log kropka txt i powiedzmy że plik log jest jakimś plikiem wyjściowym jakimś plikiem przedgenerowanym
przez nasz aplikację przez nas program.
Ten plik się ciągle zmienia i te informacje jakby nie są częścią aplikacji są do wyrzucenia są tylko
do pracy nie chcemy ich przechowywać w gicie.
Jednak gdy wykonam pracę git status no to każdorazowo będzie się pojawiał ten plik git ignore
ja mogę dodać git add.
Dodam sobie plik git ignore jednak cały czas muszę pamiętać żeby przez przypadek nie dać pliku log
txt.
Dzięki naszemu plikowi git ignore możemy poinformować gita że plik log kropka tekst ma być właśnie
ignorowany przez gita czyli zapisze plik git ignore.
Nie mam tutaj nazwy pliku który chce ignorować i uwaga sprawdźmy git status nie ma problemu.
Nasz git ignore się zmienił więc.
Mogę go dodać właściwie mogę dodać wszystko.
A nasz plik log txt nadal tu istnieje.
Jednak przez gita jest zupełnie nie widziany jest ignorowany.
Czyli ten plik mogę usunąć mogę go zmienić.
Git zupełnie będzie traktował tak jakby ten plik tutaj nie istniał.
Dodatkowo w git ignore oprócz nazwy pliku ja mogę np. tutaj dodać cały katalog zapisze plik git ignore i mamy
tylko plik log więc stworzę katalog mk dir logs następnie przeniesiemy czyli polecenie move logs txt
do katalogu logs.
Log txt do katalogu logs.
Sprawdźmy i teraz mamy katalog logs.
W nim znajduje się plik log txt.
Tutaj jest normalnie widoczny ale jeśli spojrzymy do gita to.
Jak widzisz tylko wykrył zmianę w pliku git ignore czyli tutaj wpisaliśmy nowe słowo słówko logs natomiast nie widzi zupełnie katalogu log
ani tego co się w nim znajduje.
Dodatkowo tak jak polecenia typu add reset i checkout.
Tutaj możemy używać wzorców to znaczy ja mogę stworzyć na przykład plik log a powiedzmy tekst kropka
log w głównym katalogu
i będziemy mieli wiele plików w różnych nazwach test 1 powiedzmy nazwijmy jeszcze jeden touch inny kropka log.
Tak więc będę miał tutaj wiele różnych plików kończących się na log więc mogę zrobić bardzo podobnie
mogę zrobić log gwiazdka kropka log zapisze sprawdźmy jeszcze raz git status.
Jak widzisz znowu git ignoruje wszystkie pliki które dopasowuje korzystając z wzorców z nazw plików
lub katalogów które w poszczególnych liniach są umieszczane w pliku git ignore jeśli chciałbyś np.
ingerować tylko w katalogu logs.
Pliki z rozszerzeniem log możemy to połączyć i zrobić to w ten sposób.
Sprawdźmy
teraz widzisz.
Logi są widoczne.
Katalog logs jest też widoczny.
Spróbujmy przenieść pliki log czyli move gwiazdka kropka log.
Do katalogu logs.
Katalog log jest widoczny jeśli zrobię git
add logs git status to zwróć uwagę że tutaj dodany został tylko i wyłącznie plik log txt.
Bo wszystkie inne pliki ls logs czyli pliki kończące się na kropka log są tutaj dopasowane przez ten wzorzec.
Gdy jednak z katalogu logs usunę czyli usunę z logs plik log txt żeby zostały w nim tylko te pliki
które spełniają nasz wzorzec czyli pliki kropka log kończące się rozszerzeniu kropka log zobaczmy git
status i tu mamy usunięty plik więc jeszcze dodam tą zmianę git rm logs log txt git status.
Zwróć uwagę że nie tylko zniknął nam plik log txt ale zniknął nam cały katalog logs.
Mimo że w tym katalogu mamy pliki kropka log.
Otóż git nie przechowuje katalogów git wersjonuje tylko pliki i ścieżki do plików.
Więc jeśli w katalogu nie ma żadnych plików no to nie ma żadnych zapisanych plików a więc nie ma żadnych ścieżek.
Więc jeśli katalog jest pusty to git po prostu będzie go ignorował.
Jeśli chciałbyś scommitować zapamiętać katalog gdy on na razie jest pusty dopiero będzie zawierał jakieś
pliki lub ma przechować pliki które właśnie będą ignorowane to możemy w tym katalogu stworzyć nowy plik i
ten plik nazywać się będzie gitkeep i ta nazwa gitkeep nie ma specjalnego znaczenia dla gita jest to
po prostu pusty plik ukryty.
Natomiast jest to już przyjęta konwencja jeśli ktoś widzi plik git klip to go nie usunie bo wie że to
jest specjalny plik który ma przechować zachować ten katalog zróbmy git status.
Pokazuje gitowi że ten katalog istnieje.
Jeśli jeszcze raz dodam git add.
Katalog logs to tak naprawdę tak naprawdę w pustym katalogu dodaje pusty plik git keep po to tylko żeby
zapamiętać ten katalog czy mógł scommitować pusty katalog w którym będziemy trzymać nasze pliki kropka
log które oczywiście są ignorowane więc git nie będzie tutaj zawracał nam nimi głowy.
Okej dodajmy jeszcze nasz zmieniony plik ignore
git status
jesteśmy gotowi do commita chciałbym pokazać ci jedną bardzo ważną rzecz jeśli przejdę do edytora to tutaj nasz wzorzec wyłącza
ignoruje wszystkie pliki z końcówką log w katalogu logs.
Jednak jeśli w naszym katalogu logs ja stworzę jeszcze jeden katalog np. mkdir czyli stwórz katalog logs i zrobimy more logs.
I w tym katalogu utworze jeszcze jeden plik log czyli
touch logs more logs i nazwę go powiedzmy more kropka log. Git status i tutaj oczywiście nowy katalog się pojawił z
nowymi plikami więc git add logs
i zwróć uwagę co się stało git status pokazuje mi że w katalogu more logs jest plik kropka log czyli
nasz wzorzec gwiazdka kropka log on wyłącza ignoruje tylko pliki w katalogu logs.
Jeśli w katalogu log jest kolejny katalog no to tutaj wzorzec go nie obejmuje i musiałbym albo dodawać każdy
katalog osobno aby mógł zrobić to inaczej.
Mogę tutaj zapisać gwiazdka gwiazdka kropka gwiazdka log.
Sprawdźmy jeszcze raz git status usunę tutaj
git reset logs more logs
i znowu jak widzisz cały katalog more logs jest niewidoczny.
Czyli jeśli chcesz mieć rekurencyjnie czyli katalogi w katalogi w katalogach i też wszystkie pliki na
wszystkich poziomach wyłączyć no to możesz to robić w bardzo prosty sposób po prostu dopiszesz jedna gwiazdka
jeśli chcesz żeby tylko bieżący katalog wyłączyć.
Natomiast dwie gwiazdki oznaczają że dowolna ilość katalogów pomiędzy tymi dwoma wzorcami może być wiele
zagłębień ścieżek i wszystkie pliki kropka log obojętnie jak głęboko są w tej strukturze będą one ignorowane.
Czyli to sobie zapisze.
Tu mogę usunąć nasz katalog logs more logs.
Jest to nieistotne z flagą r.
Oczywiście to jest katalog.
I jeszcze jedną bardzo ważną rzeczą jest.
Czasami może się zdarzyć że chciałbyś jakiś specjalny jeden plik zostawić a wszystkie inne wyłączyć np. w
katalogu logs.
Tutaj dodam sobie touch logs i utworzę plik specjalny kropka log git status i oczywiście jest on niewidoczny dlatego
że w naszym git ignore jest on wyłączony.
Więc jeśli masz taką sytuację że masz bardzo ogólny wzorzec który wyłącza ignoruje wiele wiele plików
ale część z tych plików lub jeden szczególny plik chciałbyś nie ignorować to nie musisz tutaj psuć tego
wzorca możesz zaprzeczyć części tego wzorca i np. nie ignorować jakiegoś pliku wykrzyknik na początku
linii odwraca dopasowanie czyli pliki dopasowane po wykrzykniku będą przez gita obserwowane.
Mimo że wzorzec wcześniej mówi że ma być gnorowany czy możemy ze wszystkich logów wyłączyć czyli logs specjalny
kropka log.
Możemy ten plik oznaczyć że nie ma być on ignorowany.
Czyli z tego wzorca który dopasowuje wszystkie logi.
Ja chcę ten jeden specjalny log potraktować inaczej i ma być on przez gita nie ignorowany.
Zobaczmy wyczyszczę git status.
I teraz jak widzisz wszystkie logi są ignorowane ale specjalny log mogę tutaj dołączyć do naszego pliku
czyli git add git ignore i git add logs git status mamy przygotowany nasz commit mamy przygotowany folder logs
który nad.
Wszystkie pliki poza git i keep będzie on przechowywany przez gita natomiast wszystkie logi w środku nie
będą przechowywane poza jednym specjalnym plikiem specjalny kropka log dlatego że ten plik jest wyłączony
z ignorowania.
Więc stwórzmy commit git commit
ignorujemy katalogi z logami
git status mamy tutaj czysty katalog roboczy wyczyszczę git log mamy listę naszych commitów wszystko jest w porządku.
Czyli jak widzisz dzięki git ignore gitkeep i różnym wzorcem dopasowania możesz powiedzieć gitowi
które części twojego projektu która część twego katalogu roboczego mają być obserwowane a które mają
być ignorowane.
To tyle jeśli chodzi o git ignore mam nadzieję że to będzie bardzo przydatne.
Tymczasem do zobaczenia w kolejnej lekcji.