/ git

Git, Version Control, Git Hub, Bit Bucket. Co to jest i o co chodzi ?

Git, to jedna z podstaw współczesnego kodowania. Jest to narzędzie służące do kolaboracji z innymi programistami, lub managerem projektu. Jeżeli kiedykolwiek będziecie chcieli pracować w firmie programistycznej albo pracować nad projektem open-source narzędzie GIT będzie jego fundamentem.

Dużo ludzi myli "GitHub" z "Git". GitHub to serwis / platforma która przechowuje nasze projekty / kody. Git to program który obsługuje proces zapisywania i pracy na repozytoriach.

GIT Praca

Wyobraźmy sobie że pracujemy w team'ie nad wspólnym projektem. Każdy pracuje nad swoim zadaniem lub częścią kodu ale wszyscy działamy na wspólnych plikach, przykładowo: index.html, global.js, style.css.

Jeżeli każdy z programistów zajmowałby się tylko jednym plikiem, to nie mamy tutaj żadnego problemu, jednakże problem pojawia się jeżeli dwóch lub więcej członków ekipy pracuje np nad index.html. Bez Git każdy z programistów nadpisywały prace innej osoby, co na pewno prowadziłoby do frustracji, utraty danych i napewno ogromnej straty czasu. Trzeba by było wyznaczyć osobę które np. laczy 3 pliki index.html w jeden, następnie rozsyła ostateczna wersje pliku pod koniec dnia pracy.

Git lub VSC jest właśnie taka osoba, automatycznym managerem projektu, lub jak to oficjalnie się nazywa systemem kontroli wersji.


Terminologia


Version Control System (VCS) albo Source Code Manager (SCM): System kontroli wersji to nic innego jak "snapshot" albo "save" aktualnego stanu kodu. VCS pozwala przywracanie stanu naszego projektu do wcześniejszej wersji, porownywanie kodu obecnej wersji do poprzednich wersji. Kto, gdzie, kiedy ...

Commit (snapshot): To nic innego jak nasz save, aktualnego kodu. Za każdym razem kiedy robimy commit, wprowadzamy zmiany do naszego repo

Repository (repo): To folder który zawiera aktualne wersje naszych plików, pod folderów. Repo może znajdować się na lokalnym komputerze jak i na zewnętrznym serwerze (GitHub, Bitbucket)

Working Directory (Folder Roboczy) : Nasz lokalny folder z plikami projektu nad którymi pracujemy w naszym edytorze tekstu.

Checkout: Następuje wtedy kiedy kopiujemy pliki z repo do naszego folderu roboczego, możemy kopiować pojedyncze pliki, całe foldery, Branch, Commit'y

Staging Area, Staging Index albo Index: To plik który przygotowuje, nadzoruje zmiany w naszym projekcie zanim zostanie zrobiony commit.

SHA: Sha hash to poprostu indywidualny numer (ID) przypisywany każdemu z naszych commitów, typowy sha to np.: e2adf8ae3e2e4ed40add75cc44cf9d0a869afeb6

Branch: To gałąź boczna naszego projektu, niezależny kanał developerski od naszego głównego nurtu (master). Głównie używany do testowania lub określania innego kierunku naszego projektu niż ten glowny.


Możemy utrzymywać nasze repozytoria lokalnie, ale zazwyczaj robi się to na zewnętrznym serwerze. Większosc ludzi zna GitHub, jest to największy i chyba w tej chwili najbardziej popularny serwis VSC. Konto w wersji podstawowej jest darmowe ale warto pamiętać że nasz kod i projekty są dostępne dla wszystkich do wglądu. Aby uzyskać możliwość prowadzenia prywatnych repozytoriów będziemy musieli zapłacić.

Jest parę alternatyw do GitHub'a, niektóre z nich dają możliwość prywatnych repozytoriów. Ponizej krotka lista alternatyw.

  1. BitBucket
    BitBucket daje możliwość prowadzenia prywatnych repo dla team'u nie większego niż 5 osób (w wersji darmowej). Dodatkowym atutem jest obsługa produktów Atlassian

  2. GitLab
    GitLab to kolejna alternatywa dla GitHub'a, rozwiązanie bardziej dla dużych firm, jego zaletą jest CI (continuous integration), narzędzie do automatyzacji testów i rozlokowania (deployment) projektów.

  3. Cloud Source by Google
    Google Cloud Source potrafi łączyć się z innymi platformami (GitHub, BitBucket) ale także mamy możliwość trzymania własnych projektów w chmurze Google, co wiąże się z niezwykłą jakością bezpieczeństwa oferowana przez usługi google.

  4. AWS CodeCommit
    Konkurencja Google'a nie śpi i oferuje podobne rozwiązania, AWS CodeCmmit może okazać się dobrym rozwiązaniem jeżeli korzystacie z innych produtktów Amazona.


Praktyka


Instalacja programu Git można przeprowadzić na wiele sposobów i zależy ona od naszego systemu operacyjnego. Jak większość nowoczesnych technologii najprościej przeprowadzić instalacje za pomocą NPM (Node.js).


npm install --save npm-git-install

Jest także opcja instalacji Git "normalnie" na Windowsa bez użycia npm, pakiet instalacyjny pod Linuxa (YUM) albo poprzez brew (MacOS). Wiecej info na temat instalacji git tutaj

Podstawowe komendy GIT


git init nazwa_folderu > stwórz nowe repo w wybranym folderze, opcja bez nazwy powoduje stworzenie repo w obecnym folderze. 

git clone nazwa_repo > skopiuj pliki z nazwa_repo do maszyny lokalnej, repo może się znajdować na naszym komputerze lub serwerze zewnętrznym, nazwa repo musi zaczynać się od https:// albo SSH
 
git config user.name nazwa_użytkownika  >  ustaw nazwę użytkownika która będzie sie pojawiala przy commit'cie. Standardowo dodaje się opcje --global aby ustalić nazwę użytkownika na wszystkie projekty

git add nazwa_folderu  lub git add nazwa_pliku lub git add -A  > Stage / przygotuj pliki do "commit'a", opcja -A dodaje wszystkie pliki w folderze.  

git commit -m "twoja_wiadmosc"  > wyślij commit do repo

*jeżeli nie dodacie opcji -m, otworzy się VIM text editor, który jest dość toporny w obsłudze dla nie zorientowanych, szybki tip jak wyjsc z VIMa : naciśnij esc i wpisz :x (zapisz i wyjdź)
 
git status  > lista plików które są staged, unstaged i untracked (nie śledzone)

git log  > wyświetl historię commit'ów. 

git diff  > pokaż różnice pomiędzy plikami staged i tymi w folderze roboczym. 

git revert nazwa_commit  > cofnij commit 

git branch > Lista dostępnych dodatkowych branch'y

git branch nazwa_branch  > stwórz nowy branch 

git merge nazwa_branch  > scal nazwa_branch z obecnie otworzoną gałęzią projektu. 

git remote add nazwa url  > nawiąż połączenie z zewnętrznym repo, po określeniu nazwy i adresu url repo, w poniższych komendach nie trzeba wpisywać adresu url. 

git fetch nazwa_remote nazwa_branch  > przywołanie konkretnego branchu z repo. 

git pull nazwa_remote > ściągnij kopię plików z repozytoriów i nadpisz swoje lokalne pliki. 

git push nazwa_remote nazwa_branch  > wyślij pliki ze swojego komputera do zewnętrznego serwera.

Poniższe komendy to tzw "hard pull" nadpisuje wszytskie lokalne zmiany i robi sync z repozytorium które jest obecnie zapisane na zewnętrznym serwerze typu GitHub

git fetch --all
git reset --hard origin/master


Pelna dokumentacje GIT w języku angieslkim mozecie znalesc tutaj

Pozdrawiam