Wpis skupiony na podstawach pracy z repozytorium zdalnym git-a. Przedstawia proces założenia nowego zdalnego repozytorium na GitHub-ie, połączenie go z repozytorium lokalnym i podstawy pracy.

W tym wpisie skupie się na pracy ze zdalnym repozytorium kodu.
Zdalne repozytorium kodu - miejsce dostępne przez Internet (albo np. sieć wewnętrzną organizacji) pozwalające na przechowywanie źródeł projektu. Zdalne repozytoria w zależności od nadanych uprawnień pozwalają użytkownikowi na operacje takie jak pobieranie/aktualizowanie przechowywanych na nich danych.
Obecnie na rynku istnieje kilka firm dostarczających produkty/usługi związane ze zdalnymi repozytoriami. Wśród najpopularniejszych znajdują się np.
Posiadają one zarówno plany darmowe, jak i płatne. Jednak z perspektywy użytkowania osobistego opcje darmowe są zazwyczaj w zupełności wystarczające. Przykłady przedstawione w ramach tego wpisu będą bazowały na usłudze GitHub, jednak w przypadku innych dostawców nie powinny występować znaczące różnice (pomijając różnicę w interfejsach użytkownika).
Aby rozpocząć pracę z GitHub-em należy na początku założyć darmowe konto na stronie github.com/join. Na tym etapie można też skonfigurowanie klucz SSH (zgodnie z tymi instrukcjami) - nie jest to konieczne, jednak jeżeli często korzystamy z tego samego komputera, to nie będziemy musieli każdorazowo logować się podczas wykonywania operacji na repozytorium zdalnym. Następnie można przejść na swój profil i stworzyć nowe repozytorium zdalne.

Podczas zakładania nowego repozytorium na GitHub-ie należy podać kilka informacji:
Automatycznie wygenerowane pliki - sekcja ta pozwala na automatyczne wygenerowanie plików:
README.md - opis projektu..gitignore - pliki ignorowane przez git-a (przydatne np. przy pracy z narzędziami takimi jak npm).
Po utworzeniu zdalnego repozytorium zostajemy przeniesieni na stronę ze wskazówkami dotyczącymi dalszego postępowania. Na tym ekranie można wybrać jeden z protokołów (https/ssh) co wpływa na aktualizację instrukcji znajdujących się poniżej. Przedstawione instrukcje pozwalają na:

W tym przypadku będę pracował z repozytorium lokalnym, które powstało w ramach poprzedniego wpisu, więc zdecyduje się na opcję drugą. Na początku należy w repozytorium lokalnym wskazać adres repozytorium zdalnego. Jedno repozytorium lokalne może być połączone z wieloma repozytoriami zdalnymi, dlatego każdemu z takich połączeń nadaje się dodatkowo identyfikującą je nazwę. Najpopularniejszą nazwą repozytorium zdalnego jest origin.
Jeżeli dla danego repozytorium lokalnego chcemy sprawdzić listę podpiętych repozytoriów zdalnych możemy przejść do jego lokalizacji i wykonać polecenie git remote. W tym przypadku ze względu na brak podpiętych repozytoriów zdalnych nie zwróci ono żadnej odwiedzi. W celu dodania repozytorium zdalnego należy wykonać polecenie git remote add [nazwa zdalnego repozytorium] [adres zdalnego repozytorium]. Po dodaniu repozytorium zdalnego ponowne wykonanie polecenia git remote powinno zwrócić jego nazwę, a wykonanie tego polecenia z dodatkowa flagą git remote -v dodatkowo wyświetli jego adres.

Po dodaniu adresu zdalnego repozytorium do repozytorium lokalnego można wypchnąć tam kod przy pomocy polecenia git push [nazwa zdalnego repozytorium] [nazwa zdalnego branch-a]. W tym przypadku zdecydowałem się na wypchnięcie lokalnych branch-y master i develop na nowo utworzone pod takimi samymi nazwami branch-e zdalne.

Push - akcja polegająca na przesłaniu zmian (commit-ów) z repozytorium lokalnego do repozytorium zdalnego.
Po przejściu na stronę repozytoria zdalnego można zauważyć, że pojawiła się już w nim zawartość dwóch wcześniej wspomnianych branch-y.

Dodatkowo dla każdego z tych branch-y możemy podejrzeć historię commit-ów. Wynika z niej, że branch master zawiera tylko jeden commit wstępny, natomiast branch develop posiada dodatkowe cztery commit-y. W celu wyrównania stanu branch-a master do stanu branch-a develop można wykonać lokalnie merge, jednak w przypadku pracy z repozytorium zdalnym możemy skorzystać z opcji wykonania pull request-a.
Pull request - proces mający na celu wprowadzenie zmian znajdujących się na pewnym branch-u do innego branch-a (często będącego źródłem dla tego pierwszego). Zazwyczaj udział w nim bierze autor zmian i inne osoby, które w ramach code review sprawdzają zmiany i mogą sugerować ewentualne usprawnienia.

Po wybraniu opcji stworzenia nowego pull request-a i wskazaniu branch-a źródłowego i docelowego można podejrzeć commit-y, które zostaną z-merge-owane w ramach tej akcji. Dodatków można podejrzeć wynikowe zmiany jakie zostaną wprowadzone w kodzie.
Gotowy pull request zazwyczaj przechodzi przez proces code review, w którym jest on analizowany i proponowane są ewentualne usprawniania. Po pomyślnym przejściu procesu można wykonać merge.

Zdalne repozytorium pozwala na utworzenie repozytoriom lokalnego na podstawione swojego stanu. Jest to możliwe dzięki wykonaniu polecenia git clone [adres zdalnego repozytorium]. Dzięki temu rozpoczęcie pracy nad projektem na innym komputerze powinno byc relatywnie bezproblemowe.
Clone - akcja tworząca nowe repozytorium lokalne będące kopią wskazanego repozytorium źródłowego.

W wyniku sklonowania repozytorium zdalnego powstało nowe repozytorium lokalne. Należy jednak zauważyć, że zawiera ono jedynie branch master ustawiony w repozytorium zdalnym jako domyślny. W celu utworzenia lokalnej kopii innego branch-a zdalnego można wykonać polecenie git checkout -b [nazwa nowego branch-a lokalnego] [źródłowego branch-a zdalnego]. Listę zdalnych branch-y można podejrzeć wykonując polecenie git branch -r.

Aktualnie oba repozytoria lokalne połączone są z tym samym repozytorium zdalnym. Umożliwia to synchronizowanie kodu między nimi. W ramach przykładu:
Z poziomu drugiego repozytorium lokalnego wprowadziłem zmiany w pliku index.html, po czym stworzyłem z nimi commit, który ostatecznie wypchnąłem na branch develop w repozytoriom zdalnym. Zmiany te zostały uwzględnione w repozytorium zdalnym, jednak nie zostały automatycznie wprowadzone w pierwszym repozytorium lokalnym.

Po powrocie do pierwszego repozytorium lokalnego i podejrzeniu dwóch ostatnich commit-ów na branch-u develop można zauważyć, ze zmiany wykonane w drugim repozytorium lokalnym, które zostały wypchnięte na repozytorium zdalne nie zostały tu automatycznie uwzględnione. Należy je pobrać. W celu pobrania zmian z branch-a repozytorium zdalnego na aktualnie aktywny branch lokalny można wykonać polencie git pull [nazwa repozytorium zdalnego] [nazwa branch-a zdalnego].
Pull - akcja polegająca na pobraniu zmian z repozytorium zdalnego i wprowadzeniu ich w repozytorium lokalnym.

Gdy nad jednym projektem równolegle pracuje kilka osób mogą pojawić się tzw. konflikty. Mają one miejsce w sytuacji, gdy próbujemy połączyć zmiany dotyczące tego samego fragmentu kodu.
Konflikt - sytuacja występująca podczas próby łączenia zmian z dwóch oddzielnych branch-y zawierających zmiany, które są trudne do automatycznego połączenia. Na przykład zmiany w tych samych linijkach kodu, albo edycja pliku na jednym branch-u, a usunięcie go na drugim.
W celu przedstawienia takiego konfliktu w pierwszym repozytorium lokalnym wykonam commit ze zmianą tekstu przycisku i wypchnę go na repozytorium zdalne. Natomiast w drugim repozytorium zmienię klasę tego samego przycisku i również spróbuję wypchnąć tę zmianę na repozytorium zdalne.

Po tak wprowadzonych zmianach na stronie widać dodatkowy napis w pierwszym przycisku:

Następnie przeszedłem do drugiego repozytorium lokalnego i dla tego samego przycisku dodałem klasę css. Specjalnie przed tym nie pobrałem zmian z repozytorium zdalnego.

W wyniku tego przycisk dostał nowe style, ale nie miał dodatkowego tekstu.

W celu połączenia zmian z dwóch źródeł zdecydowałem się z poziomu drugiego repozytorium lokalnego pobrać zmiany z repozytorium zdalnego. Na tym etapie wystąpił konflikt.

Teraz po przejściu do pliku index.html można zauważyć, że pojawiły się w nim zmiany z dwóch commit-ów, jednak nie zostały połączone w spójną całość, tylko oddzielone i specjalnie oznaczone.
index.html<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Hello git [from 2nd local repo]!</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div id="page-wrapper">
<div id="top-nav">
<<<<<< HEAD
<a class="nav-link primary-link" href="">First</a>
======
<a class="nav-link" href="">First [text from 1st local repo]</a>
>>>>>> c7734823e478ad6c82acb351f375c92aae93692e
<a class="nav-link" href="">Second</a>
<a class="nav-link" href="">Third</a>
<a class="nav-link primary-link" href="">Primary</a>
</div>
<div id="main-content">
<h1>Hello</h1>
<img id="git-logo" src="Git-Logo-2Color.png" alt="git logo" />
</div>
</div>
</body>
</html>W związku z tym na stronie pojawiły się dwa warianty pierwszego przycisku. Jeden ze zmiana tekstu, a drugi z dodatkowa klasą. Dodatkowo pomiędzy nimi wyświetlają się znaki dodane przez git-a. Strona co prawda nadal się wyświetla, ale uzyskany rezultat znacznie odbiega od oczekiwań.

W takiej sytuacji należy ręcznie rozwiązać konflikt. Trzeba wtedy zdecydować, które zmiany powinny znaleźć się w ostatecznie wersji. W tym przypadku są to zmiany z obu commit-ów. Ostatecznie uzyskany kod wygląda następująco.
index.html<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Hello git [from 2nd local repo]!</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div id="page-wrapper">
<div id="top-nav">
<a class="nav-link primary-link" href=""
>First [text from 1st local repo]</a
>
<a class="nav-link" href="">Second</a>
<a class="nav-link" href="">Third</a>
<a class="nav-link primary-link" href="">Primary</a>
</div>
<div id="main-content">
<h1>Hello</h1>
<img id="git-logo" src="Git-Logo-2Color.png" alt="git logo" />
</div>
</div>
</body>
</html>W wyniku takich zmian na stronie pojawiła się znowu jedna wersja przycisku, która poosiada zarówno zmieniony tekst jaki i dodatkową klasę css.

Po wprowadzeniu takich zmian, można je wypchnąć na branch zdalny.

Reasumując: w tym wpisie zostały przedstawione podstawy pracy ze zdalnym repozytorium git-a takie jak:
git remote / git remote -vgit remote add [nazwa zdalnego repozytorium] [adres zdalnego repozytorium]git push [nazwa zdalnego repozytorium] [nazwa zdalnego branch-a]git clone [adres zdalnego repozytorium]git branch -rgit checkout -b [nazwa nowego branch-a lokalnego] [źródłowego branch-a zdalnego]git pull [nazwa repozytorium zdalnego] [nazwa branch-a zdalnego]Praca ze zdalnym repozytorium daje wiele korzyści np.
Źródła: