~~NOCACHE~~
~~REVEAL theme=simple&size=1024x800~~
====== Git w Visual Studio ======
===== Jak utworzyć repozytorium git? =====
Różne sposoby
* repozytorium w Azure Repos, zdalne, powstaje przy tworzeniu projektu w Web Portal
* istniejące repozytorium (zdalne, lokalne) można sklonować \\ (np. z GitHub, Azure Repos)
* automatyczne tworzenie repozytorium dla nowych projektów w Visual Studio \\
* tworzenie repozytorium dla istniejącego projektu w VS
===== Klonowanie repozytorium z Azure DevOps =====
* **Team Explorer** -> **Manage Connections** -> **Connect to Project** -> **Clone**
|{{zajecia:znd_2020_1:manage-connections.png?400}}|{{zajecia:znd_2020_1:vs2017-connect-dialog.png?400}} |
Źródło: https://docs.microsoft.com/en-us/azure/devops/repos/git/
===== Klonowanie z innych źródeł =====
- **Team Explorer** -> **Local Git Repositories** -> **Clone**
- adres repozytorium (zdalne lub lokalne)
-ścieżka katalogu lokalnej wersji repozytorium
{{zajecia:znd_2020_1:clone_other_providers.png?400}}
===== Dodawanie rozwiązania do git =====
Wybieramy **Add to Source Control** z paska statusu
{{zajecia:znd_2020_1:add_to_source_control.png?400}}
przed
{{:zajecia:znd_2020_1:added_to_source_control.png?400|}}
po
===== Publikowanie repozytorium =====
* **Team Explorer** -> **Sync** -> **Publish Git Repo**
|{{:zajecia:znd_2020_1:publish-git-repo.png?400|}} |{{:zajecia:znd_2020_1:vsts-publish-repo.png?400|}} |
===== Konfiguracja repozytorium =====
* ustawienia globalne dla wszystkich repozytoriów (np. Imię, Nazwisko i email programisty) \\ **Team Explorer -> Settings -> Global settings**
* ustawienia lokalne - specyficzne dla danej kopii repozytorium (np. adres zdalny repozytorium) \\ **Team Explorer -> Settings -> Repository settings** \\
{{zajecia:znd_2020_1:global-settings-username-email.png?400}}
===== Konfiguracja adresów =====
* **Fetch** adres źródłowy pobierania zmian
* **Push** adres docelowy wysyłania zmian
* **origin** domyślna nazwa zdalnego repozytorium
{{zajecia:znd_2020_1:remotes.png?500}}
===== Git stages =====
|{{ zajecia:znd_2020_1:git_stages.png?600 }}|
===== Najważniejsze komendy =====
* **add**: dodanie nowego pliku do rewizji (śledzenie zmian)
* **commit**: zatwierdzenie zmian - powstaje nowy węzeł w repozytorium (lokalnie)
* **push** wypchnięcie zmian do zdalnego repozytorium
* **pull** pobranie zmian i scalenie z lokalną kopią
* tworzenie i scalanie (**merge**) gałęzi
* cofanie zmian (**revert**), przywracanie poprzednich stanów (**reset**)
* przeglądanie i porównywanie zmian w kodzie
===== commit: zatwierdzanie zmian =====
* ** Team Explorer** -> **Changes** lista zmian oczekujących na zatwierdzenie
* **commit** - zatwierdzenie zmian
* zmiany muszą być opatrzone opisem
|{{zajecia:znd_2020_1:changes.png?400}} | {{zajecia:znd_2020_1:commit-all.png?400|}} |
===== Synchronizacja ze zdalnym repozytorium =====
* ''push'' - wypchnięcie zmian
* ''fetch'' - pobieranie zmian (ale bez scalania)
* ''pull'' = ''fetch'' + ''merge'' - pobieranie zmian i łączenie z lokalną kopią
* ''sync'' = ''pull'' + ''push''
| {{zajecia:znd_2020_1:synchronization-menu.png?400}} | {{zajecia:znd_2020_1:fetch.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 =====
* **Undo changes** - wycofywanie niezatwierdzonych zmian
* **Revert** - cofanie zatwierdzonych zmian, nie zmienia historii ale tworzy nowy //commit//,
* **Reset** - przywraca historyczną wersję repozytorium. \\ Nie należy używać na współdzielonych z zespołem gałęziach
|{{ zajecia:znd_2020_1:vs_reset_single_file.gif?400}}|{{zajecia:znd_2020_1:vs_revert_changes.png?400}}| {{zajecia:znd_2020_1:vs_reset_branch.png?400}}|
===== 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 ======
* **Team Explorer** -> **Branches** -> **New Local Branch From....**
{{zajecia:znd_2020_1:vsbranch.gif}}
===== Scalanie gałęzi (merge) =====
**merge** - scalanie zmian z innej gałęzi do aktualnej gałęzi
|{{zajecia:znd_2020_1:select-merge-after-checking-out-master-branch.png?400}} \\ {{zajecia:znd_2020_1:merge-conflict-resolved.png?400}}|{{zajecia:znd_2020_1:fill-source-branch-name-and-click-merge.png?400}}|
===== Konflikty =====
* łączenie kodu odbywa się automatycznie jeżeli to możliwe
* konflikt, gdy ta sama linia została zmieniona w osobnych gałęziach i automatyczne scalenie nie jest możliwe
* może wystąpić przy operacji **pull**, **sync**, **merge**
{{zajecia:znd_2020_1:merge_prompt_vs.png?500}}
===== Rozwiązywanie konfliktów =====
* **Take source** - nadpisz zmianami ze źródłowej gałęzi
* **Keep Target** - nadpisz zmianami z docelowej gałęzi
{{zajecia:znd_2020_1:resolving-merge-conflicts-view-files-causing-conflicts.png?400}}
===== Ręczne scalanie konfliktów =====
{{zajecia:znd_2020_1:image34.png?800}}
===== Pull request ====
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
|{{ zajecia:znd_2020_1:pull-requests.png?300 }}| {{ zajecia:znd_2020_1:new-pull-request.png?300 }}|
===== Typowy workflow =====
{{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/
===== Więcej informacji =====
* {{https://docs.microsoft.com/en-us/azure/devops/repos/git/?view=azure-devops|Azure Repos Git Documentation}}
* [[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