~~NOCACHE~~
~~REVEAL theme=simple&disableLayout=0&transition=none&controls=1&show_progress_bar=1&build_all_lists=0&show_image_borders=0&horizontal_slide_level=2&enlarge_vertical_slide_headers=0&show_slide_details=1&open_in_new_window=1&size=1024x768~~
====== Systemy kontroli wersji Git i GitHub ======
===== System kontroli wersji =====
* repozytorium kodu (i nie tylko) z historią zmian
* mechanizmy współdzielenia pracy członków zespołu, synchronizacja zmian
* śledzenie zmian w kodzie, porównywanie różnic w wersjach kodu, patche
* rozwój kolejnych wersji i gałęzi oprogramowania oraz mechanizmy łączenia ich
* historia rozwoju, dokumentacja zmian w kolejnych wersjach
* kopie bezpieczeństwa - możliwość wycofania zmian, powrotu do poprzedniego stanu
===== Git =====
* zdecentralizowany, każdy użytkownik posiada pełną kopię repozytorium
* można pracować lokalnie
* większość operacji wykonywana lokalnie (szybszy w działaniu od scentralizowanych)
* wygodny mechanizm tworzenia gałęzi
* elastyczny, możliwość wdrożenia różnych //workflow// (procesów wytwórczych)
* [[https://git-scm.com/]]
* usługi udostępniające repozytoria git: [[https://github.com/|GitHub]], [[https://azure.microsoft.com/pl-pl/products/devops/|Azure DevOps]], [[https://about.gitlab.com/|GitLab]], [[https://bitbucket.org/|BitBucket]]
===== Architektura rozproszona =====
|{{http://git-scm.com/figures/18333fig0102-tn.png?400|}} | {{http://git-scm.com/figures/18333fig0103-tn.png?400}}|
Źródło: http://git-scm.com
Każdy węzeł przechowuje całą historię repozytorium.
===== Historia zmian projektu =====
* **master** (lub **main**) - gałąź główna
* **branches** - odgałęzienia, wersje rozwojowe
* **tags** - wersja zamrożona (np. v.1.0), etykieta
{{https://i.stack.imgur.com/mvc6E.png?600}}
===== Repozytoria git w Visual Studio =====
* git - repozytoria lokalne i zdalne
* automatyczne tworzenie repozytorium dla nowych projektów w Visual Studio
* istniejący projekt można umieścic w repozytorium
* integracja z GitHub (lub innymi np. Azure DevOps)
* repozytorium można utworzyć na stronie usługi
* istniejące repozytorium (zdalne, lokalne) można **sklonować**
* publikowanie zmian do GitHub
===== Dodawanie rozwiązania do git =====
Wybieramy **Add to Source Control** z paska statusu
{{zajecia:cs:vs_dodaj_do_kontroli.png?600}}
przed
{{zajecia:cs:vs_dodaj_do_kontroli_2.png?600}}
po
===== Okno: Zmiany git =====
* **Widok** -> **Zmiany git**
{{zajecia:cs:vs_zmiany_git.png?400}}
{{zajecia:cs:vs_git_zmiany_2.png?350}}
===== Okno: Repozytorium git =====
* **Widok** -> **Repozytorium Git**
{{https://learn.microsoft.com/pl-pl/visualstudio/version-control/media/git-source-control-repository-management.png?800|}}
===== Etapy pracy git =====
|{{ zajecia:znd_2020_1:git_stages.png?600 }}|
===== Najważniejsze komendy =====
* **Dodaj** (add): dodanie nowego pliku do śledzenia
* **Zatwierdź** (commit): zatwierdzenie zmian, powstaje nowy węzeł w repozytorium (lokalnie)
* **Wypchnij** (push): wypchnięcie zmian do zdalnego repozytorium
* **Ściągnij** (pull): pobranie zmian i scalenie z lokalną kopią
* tworzenie i scalanie gałęzi (merge)
* cofanie zmian (revert), przywracanie poprzednich stanów (reset)
* przeglądanie i porównywanie zmian w kodzie
===== Zatwierdzanie zmian =====
* okno **Zmiany git** zawiera listę wykrytych zmian
* **Zatwierdź wszystko** (commit) - zatwierdzenie zmian
* zmiany muszą być opatrzone opisem
{{zajecia:cs:vs_git_zatwierdz.png?400|}}
===== Historia zmian =====
* historia zmian - każda zatwierdzona zmiana tworzy węzeł w repozytorium
{{zajecia:znd_2020_1:history-abcd.png?300}} \\
{{zajecia:znd_2020_1:git_history.png?400}}
===== Porównywanie zmian w pliku =====
{{zajecia:znd_2020_1:vs-diff-changes.png}}
===== Cofanie zmian =====
* **Cofnij zmiany** (Undo changes) - wycofywanie niezatwierdzonych zmian
* **Przywróć** (Revert) - cofanie zatwierdzonych zmian, nie zmienia historii ale tworzy nowy punkt w historii
* **Resetuj** (Reset) - przywraca historyczną wersję repozytorium
|{{ zajecia:cs:vs_cofnij.png?400}}|{{zajecia:cs:vs_git_cofnij.png?300}}|
==== Ćwiczenia ====
- Dodaj rozwiązanie projektu (dowolnego) do repozytorium git
- Dokonaj przynajmniej jednej zmiany w kodzie i zatwierdź zmiany w repozytorium
- Obejrzyj zmiany w oknie historii
- Porównaj zmiany
===== Gałęzie (branches) ======
* gałęzie zawierają równolegle rozwijane wersje kodu, pomiędzy którymi możemy w prosty sposób się przełączać (**checkout**)
* **master** domyślna nazwa głównej gałęzi
{{zajecia:znd_2020_1:branch.png}}
===== Tworzenie gałęzi ======
* **Git** -> **Nowa gałąź**
{{zajecia:cs:vs_git_nowa_galaz.png?400|}}
===== Scalanie gałęzi (merge) =====
* zaznacz gałąź docelową (master) -> "Scal master z ... " - scalanie zmian z innej gałęzi do aktualnej gałęzi
| {{zajecia:cs:vs_git_scal.png?400|}} | {{zajecia:znd_2020_1:merge-conflict-resolved.png?400}} |
===== GitHub =====
* https://github.com/
* repozytoria publiczne i prywatne
* zarządzanie projektem zespołowym: zgłoszenia **Issue Tracker**
* komentarze do kodu
* mechanizm żądania ściągnięcia (pull request) i rewizje kodu
* integracja z wieloma narzędziami
* [[https://learn.microsoft.com/pl-pl/visualstudio/version-control/git-create-github-account?view=vs-2022|Tworzenie konta usługi GitHub do użycia z programem Visual Studio]]
===== Synchronizacja ze zdalnym repozytorium =====
* **Wypchnij** (''push'') - wypchnięcie zmian
* **Pobierz** (''fetch'') - pobieranie zmian (ale bez scalania)
* **Ściągnij** (''pull'') - pobieranie zmian i scalenie z lokalną kopią
* **Sync** - ściągnij a następnie wypchnij
| {{zajecia:cs;vs_push_menu.png?300}} | {{zajecia:cs:vs_git_wypchnij.png?400|}} |
===== Żądanie ściągnięcia ====
Po wysłaniu zmian umieszczonych w osobnej gałęzi możemy poprosić członków zespołu o weryfikację kodu i dodanie do głównej gałęzi
^ VS 2022 ^ GitHub ^
|{{ zajecia:cs:vs_pull_request.png?400 }}| {{ zajecia:cs:github_pull_request.png?400 }}|
===== Typowy przepływ pracy =====
{{https://3kllhk1ibq34qk6sp3bhtox1-wpengine.netdna-ssl.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png?600}}
Źródło: https://www.atlassian.com/blog/bitbucket/5-pull-request-must-haves
===== =====
- tworzymy nową gałąź (nowa funkcja, naprawa błędu, ...)
- zmieniamy zawartość nowej gałęzi i zatwierdzamy zmiany (**commit**)
- gdy praca skończona wysyłamy gałąź do zdalnego repozytorium (**push**)
- składamy prośbę (//pull request//) o weryfikację kodu i integrację z główną gałęzią
- gdy zmiany zostaną przyjęte, wówczas aktualizujemy lokalną kopię ze zmianami, które mogli nanieść inni użytkownicy, rozwiązujemy konflikty
===== A successful Git workflow =====
{{http://nvie.com/img/git-model@2x.png?450}}
Źródło: http://nvie.com/
===== Klonowanie repozytorium z GitHub =====
**Git** -> **Klonuj repozytorium**
^ VS 2022 ^ ^ GitHub ^
|{{zajecia:cs:vs_klonuj.png?300}}|{{zajecia:cs:vs_klonuj_2.png?300}}|{{zajecia:cs:github_clone.png?300}}|
===== Zadanie 1 =====
- Załóż konto w usłydze GitHub (jesli jeszcze nie posiadasz)
- Zaakceptuj zadanie, którego adres otrzymałeś pocztą. Adres zaproszenia znajduje się również na stronie Moodle [[https://moodle.umk.pl/mod/assign/view.php?id=120981|tutaj]]
- Sklonuj rozwiązanie znajdujące się w repozytorium GitHub
- Wykonaj zadanie zgodnie z treścią. Treść zadania znajdziesz także w pliku README.md w repozytorium
- Wypchnij rozwiązanie zadania do repozytorium GitHub skojarzonego z tym zadaniem
===== =====
Napisz program, który prosi o wprowadzenie linii tekstu a następnie wyrysowuje podany tekst w ramce wg. poniższego wzoru
Podaj tekst: Witaj Świecie
*****************
* Witaj Świecie *
*****************
===== Więcej informacji =====
* [[http://git-scm.com/|git - fast version control]]
* {{http://fizyka.umk.pl/~jacek/dydaktyka/inzynieria/Git.pdf|Git i GitLab w Visual Studio }} by Jacek Matulewski
* [[https://learn.microsoft.com/en-us/visualstudio/version-control/git-with-visual-studio?view=vs-2022|Start with Git & GitHub in Visual Studio]]