Praktyczny kurs GIT dla zielonych cz. 1 – instalacja i podstawy działania

W artykule znajdziemy opis i wprowadzenie do systemu GIT. W części pierwszej omówię powody i zalety stosowania Git’a, instalację na kilku wybranych, popularnych systemach operacyjnych, oraz podstawowe pojęcia związane z użytkowaniem. Kurs kierowany będzie do osób początkujących w dziedzinie programowania i/lub administrowania systemami.

Spis treści

  1. Wstęp
    1. Słowem wstępu
    2. Najważniejsze zalety Git’a z perspektywy początkującego programisty
    3. Dlaczego Git, a nie alternatywy?
  2. Instalacja
    1. Linux
    2. macOS
    3. Windows
  3. Podstawowe pojęcia
    • Repozytorium
    • Commit
    • Branch
    • Revert
    • Push/Pull
  4. Podsumowanie części pierwszej

Słowem wstępu

Pisząc ten poradnik będę starał się pisać jak najprostszym językiem, dla osób początkujących i nie specjalnie technicznych. Będę również próbował dawać jak najwięcej przykładów i scenariuszy, żeby dobrze zobrazować możliwości i praktyczne sposoby ich zastosowania. Podkreślone słowa kluczowe będą dokładniej opisywane na końcu każdego posta. W tym poradniku będziemy używać wiersza poleceń, ponieważ jest to uniwersalne narzędzie działające na wszystkich systemach.
Tworząc oprogramowanie często pojawiają się następujące problemy (scenariusze):

  • Zmieniłem kawałek kodu i program przestał działać, nie mam kopii zapasowej.
  • Piszę program z kilkoma osobami i trzeba wymieniać się kodem. Kilka osób nie może pisać jednocześnie bo będziemy sobie nadpisywać zmiany.
  • Wracam po długim czasie do projektu i zastanawiam się co robił dany kawałek kodu?
  • Jakie dokładnie zmiany wprowadziłem do kodu? Czy mam wszystkie pliki, czy coś zostało usunięte?
  • Jak rozróżnić kto jest odpowiedzialny za napisanie kawałku kodu, żeby go zapytać co miał na myśli albo jak coś działa?

Rozwiązanie tych i innych problemów zapewnia złoty lek w postaci Git. Jest to system przechowywania plików który zapamiętuje zmiany w kodzie, oraz wszelkie istotne informacje dotyczące jego rozwijania.

Najważniejsze zalety z perspektywy początkującego użytkownika:

Przy każdej zmianie kodu, Git zapamięta co się zmieniło, przez kogo i w jakich plikach. Dzięki temu zawsze będziemy mogli przejrzeć historię zmian i sprawdzić co tam będzie nas interesować. Git zapamiętuje miejsce zmian co do linijki w pliku, co pozwala dwóm osobom pracować jednocześnie, nawet na tym samym pliku. Jeśli obie osoby będą pracować w różnych częściach pliku nie wystąpią konflikty, a zmiany zsynchronizują się (pół)automatycznie. Brzmi nieźle?

Do zmian programista musi dodać komentarz, dzięki czemu mamy mniej więcej pojęcie czego dotyczyły dane zmiany w kodzie. Jeśli wystąpią błędy przy automatycznym łączeniu zmian z różnych źródeł, użytkownik zostanie o tym poinformowany i samodzielnie będzie mógł zdecydować, jak dany konflikt rozwiązać. Do tego dodajmy bezproblemową możliwość pracy (zarówno lokalnej jak i zdalnej) na wielu różnych wersjach kodu i możliwość przełączania się między nimi jedną komendą. A to wszystko tylko namiastka pełnych możliwości.

Dlaczego Git, a nie alternatywy?

Wiele sposobów wymiany plików z kodem daje wybrane możliwości, spośród wyżej wymienionych. Nie znam jednak innego sposobu na przechowywanie plików tekstowych (czyli głównie kodu), który łączyłby wszystkie te cechy. Przykładowo, możemy użyć dowolnego systemu przechowywania plików w chmurze np. Google Docs. Serwis ten od niedawna posiada również wersjonowanie (możliwość wglądu w poprzednie wersje) plików. Istnieje nawet oprogramowanie które automatycznie synchronizuje nam z chmurą wybrane przez nas foldery. Problem pojawia się jednak, gdy kilka osób pracuje nad projektem jednocześnie. Prędzej czy później dojdzie do procederu nadpisywania sobie wzajemnie plików, co może być tragiczne w skutkach.

Pewnego rodzaju przełomem był (a nawet dalej jest, na szczęście powoli wymierający) SVN. Jest on prostszy w zrozumieniu i użytkowaniu jednak ma swoje ograniczenia. Przykładową, a zarazem jedną z ważniejszych wad jest fakt, iż system ten jest scentralizowany, przez co wszelkie operacje aktualizacji kodu są zdalne. Z tego powodu szybkość wprowadzania zmian zależy od prędkości Internetu (albo i jego braku). Nie ma możliwości przetrzymywania zmian lokalnie (w celu późniejszej synchronizacji kiedy Internet się znowu pojawi). Oczywiście można poznajdować i doinstalować wymagane dodatki odpowiadające za poszczególne funkcjonalności, ale po co? Czy nie lepiej mieć wszystko razem, gotowe i zunifikowane out-of-the-box (od razu po instalacji)?