Zamiast wstępu
Cześć! Dzisiaj porozmawiamy o systemie kontroli wersji, a mianowicie Git.
Podstawy Gita
Git to rozproszony system kontroli wersji naszego kodu. Dlaczego tego potrzebujemy? Rozproszone zespoły potrzebują jakiegoś systemu do zarządzania swoją pracą. Konieczne jest śledzenie zmian zachodzących w czasie. Oznacza to, że musimy zobaczyć krok po kroku, które pliki uległy zmianie i jak. Jest to szczególnie ważne, gdy badasz, co się zmieniło w kontekście pojedynczego zadania, umożliwiając cofnięcie zmian.Instalowanie Gita
Zainstalujmy Javę na twoim komputerze.Instalowanie w systemie Windows
Jak zwykle musisz pobrać i uruchomić plik exe. Tutaj wszystko jest proste: kliknij pierwszy link Google , przeprowadź instalację i to wszystko. W tym celu użyjemy konsoli bash dostarczanej przez system Windows. W systemie Windows musisz uruchomić Git Bash. Oto jak to wygląda w menu Start:

Instalacja w Linuksie
Zwykle Git jest częścią dystrybucji Linuksa i jest już zainstalowany, ponieważ jest to narzędzie, które zostało pierwotnie napisane do rozwoju jądra Linuksa. Ale są sytuacje, kiedy tak nie jest. Aby to sprawdzić, musisz otworzyć terminal i napisać: git --version. Jeśli otrzymasz zrozumiałą odpowiedź, nic nie trzeba instalować. Otwórz terminal i zainstaluj Git na Ubuntu . Pracuję nad Ubuntu, więc mogę ci powiedzieć, co dla niego napisać: sudo apt-get install git.Instalacja na macOS
Tutaj również musisz najpierw sprawdzić, czy Git już tam jest. Jeśli go nie masz, najłatwiejszym sposobem na jego zdobycie jest pobranie najnowszej wersji tutaj . Jeśli Xcode jest zainstalowany, Git na pewno zostanie automatycznie zainstalowany.Ustawienia Gita
Git ma ustawienia użytkownika dla użytkownika, który prześle pracę. Ma to sens i jest konieczne, ponieważ Git pobiera te informacje dla pola Autor podczas tworzenia zatwierdzenia. Skonfiguruj nazwę użytkownika i hasło dla wszystkich swoich projektów, uruchamiając następujące polecenia:
git config --global user.name "Ivan Ivanov"
git config --global user.email ivan.ivanov@gmail.com
Jeśli chcesz zmienić autora dla konkretnego projektu, możesz usunąć „--global”. To da nam następujące:
git config user.name "Ivan Ivanov"
git config user.email ivan.ivanov@gmail.com
Trochę teorii...
Aby zagłębić się w temat, powinniśmy przedstawić Ci kilka nowych słów i działań...- repozytorium git
- popełniać
- oddział
- łączyć
- konflikty
- ciągnąć
- naciskać
- jak zignorować niektóre pliki (.gitignore)
Statusy w Git
Git ma kilka posągów, które należy zrozumieć i zapamiętać:- nieśledzony
- zmodyfikowane
- wystawiany na scenie
- zaangażowany
Jak należy to rozumieć?
Oto statusy, które dotyczą plików zawierających nasz kod:- Plik, który został utworzony, ale nie został jeszcze dodany do repozytorium, ma status „nieśledzony”.
- Gdy dokonujemy zmian w plikach, które zostały już dodane do repozytorium Git, wówczas ich status to „zmodyfikowany”.
- Spośród plików, które zmieniliśmy, wybieramy te, które są nam potrzebne, i tym klasom zmieniamy status na „staged”.
- Zatwierdzenie jest tworzone z przygotowanych plików w stanie etapowym i trafia do repozytorium Git. Po tym nie ma plików ze statusem „wystawiony”. Ale nadal mogą istnieć pliki, których status to „zmodyfikowany”.

Co to jest zatwierdzenie?
Zatwierdzenie jest głównym wydarzeniem, jeśli chodzi o kontrolę wersji. Zawiera wszystkie zmiany dokonane od początku zatwierdzenia. Zatwierdzenia są ze sobą połączone jak pojedynczo połączona lista. Dokładniej: jest pierwsze zatwierdzenie. Kiedy tworzone jest drugie zatwierdzenie, wie, co następuje po pierwszym. W ten sposób można śledzić informacje. Zatwierdzenie ma również swoje własne informacje, tzw. metadane:- unikalny identyfikator zatwierdzenia, którego można użyć do jego znalezienia
- nazwisko autora zatwierdzenia, który je utworzył
- datę utworzenia zatwierdzenia
- komentarz opisujący, co zostało zrobione podczas zatwierdzenia

Co to jest oddział?
Gałąź jest wskaźnikiem do jakiegoś zatwierdzenia. Ponieważ zatwierdzenie wie, które zatwierdzenie je poprzedza, gdy gałąź wskazuje na zatwierdzenie, wszystkie poprzednie zatwierdzenia również mają do niego zastosowanie. W związku z tym możemy powiedzieć, że możesz mieć dowolną liczbę gałęzi wskazujących na to samo zatwierdzenie. Praca odbywa się w gałęziach, więc kiedy tworzone jest nowe zatwierdzenie, gałąź przenosi swój wskaźnik do nowszego zatwierdzenia.Pierwsze kroki z Gitem
Możesz pracować zarówno z lokalnym repozytorium, jak i zdalnym. Aby przećwiczyć wymagane polecenia, możesz ograniczyć się do lokalnego repozytorium. Przechowuje tylko wszystkie informacje o projekcie lokalnie w folderze .git. Jeśli mówimy o zdalnym repozytorium, to wszystkie informacje są przechowywane gdzieś na zdalnym serwerze: tylko kopia projektu jest przechowywana lokalnie. Zmiany dokonane w twojej lokalnej kopii mogą zostać wypchnięte (git push) do zdalnego repozytorium. W naszej dyskusji tutaj i poniżej mówimy o pracy z Gitem w konsoli. Oczywiście możesz użyć jakiegoś rozwiązania opartego na GUI (na przykład IntelliJ IDEA), ale najpierw powinieneś dowiedzieć się, jakie polecenia są wykonywane i co oznaczają.Praca z Git w lokalnym repozytorium
Następnie sugeruję, abyś postępował zgodnie z instrukcjami i wykonał wszystkie kroki, które wykonałem podczas czytania artykułu. Poprawi to twoje zrozumienie i opanowanie materiału. Cóż, smacznego! :) Aby utworzyć lokalne repozytorium, musisz napisać:
git init

git status

- git add -A — dodaje wszystkie pliki do stanu „stadium”.
- dodaj git. — dodaj wszystkie pliki z tego folderu i wszystkich podfolderów. Zasadniczo jest to to samo, co poprzednie
- git add <nazwa pliku> — dodaje określony plik. Tutaj możesz użyć wyrażeń regularnych, aby dodać pliki według jakiegoś wzorca. Na przykład git add *.java: Oznacza to, że chcesz dodać tylko pliki z rozszerzeniem java.
git add *.txt
Aby sprawdzić status, używamy znanego nam polecenia:
git status

git commit -m "all txt files were added to the project"

git log

git status

git status

git diff

git add test_resource.txt
git commit -m "added hello word! to test_resource.txt"
Aby przejrzeć wszystkie zatwierdzenia, napisz:
git log

git add GitTest.java
git commit -m "added GitTest.java"
git status

Praca z .gitignore
Najwyraźniej chcemy tylko przechowywać sam kod źródłowy i nic więcej w repozytorium. Więc co jeszcze może być? Jako minimum skompilowane klasy i/lub pliki generowane przez środowiska programistyczne. Aby powiedzieć Gitowi, aby je ignorował, musimy utworzyć specjalny plik. Zrób to: utwórz plik o nazwie .gitignore w katalogu głównym projektu. Każda linia w tym pliku reprezentuje wzorzec do zignorowania. W tym przykładzie plik .gitignore będzie wyglądał następująco:
```
*.class
target/
*.iml
.idea/
```
Spójrzmy:
- Pierwsza linia to ignorowanie wszystkich plików z rozszerzeniem .class
- Drugi wiersz to zignorowanie folderu „docelowego” i wszystkiego, co zawiera
- Trzecia linia to ignorowanie wszystkich plików z rozszerzeniem .iml
- Czwarta linia to zignorowanie folderu .idea
git status


git add .gitignore
git commit -m "added .gitignore file"
A teraz chwila prawdy: mamy skompilowaną klasę GitTest.class, która jest „nieśledzona”, której nie chcieliśmy dodawać do repozytorium Git. Teraz powinniśmy zobaczyć efekty działania pliku .gitignore:
git status

Praca z oddziałami i tym podobne
Oczywiście praca tylko w jednym oddziale jest niewygodna dla samotnych programistów i jest niemożliwa, gdy w zespole jest więcej niż jedna osoba. Od tego mamy oddziały. Jak powiedziałem wcześniej, gałąź jest po prostu ruchomym wskaźnikiem do zatwierdzeń. W tej części przyjrzymy się pracy w różnych gałęziach: jak scalać zmiany z jednej gałęzi w drugą, jakie konflikty mogą się pojawić i wiele więcej. Aby zobaczyć listę wszystkich oddziałów w repozytorium i zrozumieć, w którym się znajdujesz, musisz napisać:
git branch -a

- utwórz nowy oddział na podstawie tego, w którym jesteśmy (99% przypadków)
- utwórz branch na podstawie konkretnego commita (1% przypadków)
Stwórzmy gałąź na podstawie konkretnego zatwierdzenia
Będziemy polegać na unikalnym identyfikatorze zatwierdzenia. Aby go znaleźć, piszemy:
git log

git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
Gałąź jest tworzona tylko z dwoma pierwszymi zatwierdzeniami z gałęzi głównej. Aby to zweryfikować, najpierw przełączymy się do innej gałęzi i spojrzymy na liczbę zatwierdzeń:
git status
git log

git branch -a

Stwórzmy gałąź opartą na obecnej
Drugim sposobem na utworzenie gałęzi jest utworzenie jej z innej. Chcę utworzyć gałąź opartą na gałęzi głównej. Najpierw muszę się na niego przełączyć, a następnym krokiem jest utworzenie nowego. Spójrzmy:- git checkout master — przełącz się do gałęzi master
- git status — sprawdź, czy rzeczywiście jesteśmy w gałęzi master

git checkout -b feature/update-txt-files

Rozwiązanie konfliktu
Zanim zbadamy, czym jest konflikt, musimy porozmawiać o łączeniu jednej gałęzi w drugą. Ten obraz przedstawia proces łączenia jednej gałęzi w drugą:

git add *.txt
git commit -m "updated txt files"
git log

git checkout master
git merge feature/update-txt-files
git log

git branch -D feature/update-txt-files
Jak na razie wszystko jasne, tak? Skomplikujmy sytuację: teraz powiedzmy, że musisz ponownie zmienić plik txt. Ale teraz ten plik zostanie zmieniony również w gałęzi master. Innymi słowy, będzie się zmieniać równolegle. Git nie będzie w stanie wymyślić, co zrobić, gdy będziemy chcieli scalić nasz nowy kod z gałęzią master. Chodźmy! Stworzymy nową gałąź opartą na master, wprowadzimy zmiany w text_resource.txt i utworzymy zatwierdzenie dla tej pracy:
git checkout -b feature/add-header
... we make changes to the file

git add *.txt
git commit -m "added header to txt"

git checkout master
… we updated test_resource.txt

git add test_resource.txt
git commit -m "added master header to txt"
A teraz najciekawszy punkt: musimy scalić zmiany z gałęzi feature/add-header do master. Jesteśmy w gałęzi master, więc wystarczy napisać:
git merge feature/add-header
Ale rezultatem będzie konflikt w pliku test_resource.txt: 

- Zmiany, które były w tej linii w gałęzi master, znajdują się między „<<<<<<< HEAD” i „=======”.
- Zmiany, które były w gałęzi Feature/add-header, znajdują się między „=======” a „>>>>>>> feature/add-header”.

git status

git add *.txt

git commit

Praca ze zdalnymi repozytoriami
Ostatnim krokiem jest wymyślenie kilku dodatkowych poleceń, które są potrzebne do pracy ze zdalnym repozytorium. Jak powiedziałem, zdalne repozytorium to jakieś miejsce, w którym przechowywane jest repozytorium iz którego można je sklonować. Jakie są rodzaje zdalnych repozytoriów? Przykłady:-
GitHub to największa platforma do przechowywania repozytoriów i wspólnego programowania. Opisywałem to już w poprzednich artykułach.
Śledź mnie na GitHub . Często popisuję się tam swoją pracą w obszarach, których uczę się do pracy. -
GitLab to internetowe narzędzie do cyklu życia DevOps z otwartym kodem źródłowym . Jest to oparty na Git system do zarządzania repozytoriami kodu z własną wiki, systemem śledzenia błędów , potokiem CI/CD i innymi funkcjami.
Po wiadomości, że Microsoft kupił GitHub, niektórzy programiści zduplikowali swoje projekty w GitLabie. -
BitBucket to usługa internetowa do hostingu projektów i wspólnego rozwoju oparta na systemach kontroli wersji Mercurial i Git. Kiedyś miał dużą przewagę nad GitHubem, ponieważ oferował darmowe prywatne repozytoria. W zeszłym roku GitHub również udostępnił tę możliwość wszystkim za darmo.
-
I tak dalej…
git clone https://github.com/romankh3/git-demo
Istnieje teraz pełna lokalna kopia projektu. Aby mieć pewność, że lokalna kopia projektu jest najnowsza, musisz pobrać projekt, pisząc:
git pull


git add test_resource.txt
git commit -m "prepared txt for pushing"
Polecenie przekazania tego do zdalnego repozytorium to:
git push

Przydatne łącze
- Oficjalna dokumentacja Gita . Polecam jako punkt odniesienia.
GO TO FULL VERSION