Git

Czyli jak nie narobi膰 馃挬 w repozytorium

Rozproszony system kontroli wersji

  • 艣ledzenie wszystkich zmian dokonywanych w plikach
  • mo偶liwo艣膰 przywr贸cenia poprzedniej wersji pliku
  • wsp贸艂dzielenie plik贸w z innymi
  • 艂膮czenie zmian dokonywanych w plikach przez wiele os贸b w r贸偶nym czasie
  • obs艂uga du偶ych projekt贸w

Podstawy

Git przechowuje dane jako zestaw migawek (snapshot).

Za ka偶dym razem gdy wprowadzamy zmian臋 do projektu, Git tworzy obraz przedstawiaj膮cy to jak wygl膮daj膮 pliki w danym momencie.

Niemal ka偶da operacja jest lokalna

Wi臋kszo艣膰 operacji jakie przeprowadzamy wymaga jedynie dost臋pu do lokalnych plik贸w i zasob贸w.

Git wy艂膮cznie dodaje nowe dane

Wykonuj膮c prac臋 niemal zawsze jedynie dodajemy dane do bazy danych Git.

Pozwala to na eksperymentowanie bez ryzyka - zawsze mo偶emy wr贸ci膰 do poprzedniej wersji projektu.

Stany

  • zmodyfikowany
  • 艣ledzony
  • zatwierdzony

Instalacja

Standardowy spos贸b instalacji w systemie Linux opartym na Debianie (np. Ubuntu).

$ sudo apt-get install git

Ustawienia to偶samo艣ci


                $ git config --global user.name "John Doe"
                $ git config --global user.email johndoe@example.com
                

Aliasy

Nie ma potrzeby pami臋tania d艂ugich, skomplikowanych komend. Mo偶na skorzysta膰 z alias贸w:


                $ git config --global alias.co checkout
                $ git config --global alias.br branch
                $ git config --global alias.ci commit
                $ git config --global alias.st status
                

Podgl膮d ustawie艅

$ git config --list

                    alias.co=checkout
                    alias.br=branch
                    alias.ci=commit
                    alias.st=status
                    alias.unstage=reset HEAD --
                    alias.last=log -1 HEAD
                    user.email=norbert.waszkowiak@wat.edu.pl
                    user.name=Norbert Waszkowiak
                

Uwierzytelnianie

Warto wymieni膰 si臋 kluczem ssh z serwisem hostingowym, na kt贸rym znajduj膮 si臋 repozytoria.

git init

Tworzymy nowe repozytorium gita

git clone

Klonujemy istniej膮ce repozytorium

git add

Dodajemy pliki do "poczekalni"

git commit

Zatwierdzamy zmiany (tworzymy commita)

$ git commit -m "<tre艣膰 commita>"

git status

Sprawdzamy status repozytorium

git log

Sprawdzamy histori臋 zmian


                ~/work/sages master > git log

                commit 3f2330dcbe4219835ab81b35f93a86710205b520 (HEAD -> master)
                Author: Norbert Waszkowiak <norbert.waszkowiak@wat.edu.pl>
                Date:   Wed Jun 22 15:29:06 2022 +0200

                    Initial commit
                

git diff

Por贸wnujemy zmiany


                ~/work/sages master !1 > git diff

                diff --git a/hasla.txt b/hasla.txt

                index 77a7723..d00821a 100644
                --- a/hasla.txt
                +++ b/hasla.txt
                @@ -1 +1 @@
                -mkaminski;m4ttek123
                +mstone;m4ttek123
                

git revert

Wycofujemy zmiany


                ~/work/sages master > git revert 47f8cfc6f7592320365bcc55d0a5b50f2a844773

                [master 20a9cda] Revert "Random commit"
                 1 file changed, 1 deletion(-)
                 delete mode 100644 hasla.txt
                

git reset

Resetujemy zmiany


                ~/work/sages master > git reset 47f8cfc6f7592320365bcc55d0a5b50f2a844773

                Unstaged changes after reset:
                D	hasla.txt
                

git restore

Przywracanie zmian


                 ~/work/sages master !1 > git status
                On branch master
                Changes not staged for commit:
                  (use "git add ..." to update what will be committed)
                  (use "git restore ..." to discard changes in working directory)
                    modified:   lista_pracownikow.txt

                no changes added to commit (use "git add" and/or "git commit -a")

                ~/work/sages master !1 > git restore lista_pracownikow.txt

                ~/work/sages master > git status
                On branch master
                nothing to commit, working tree clean
                

git commit --amend

Modyfikujemy commita


                $ git commit --amend
                

git rebase

Przemieszczamy commity


                $ git rebase <nazwa brancha>
                

git branch

Zarz膮dzamy branchami


                $ git branch
                

git checkout

Prze艂膮czamy si臋 mi臋dzy branchami


                $ git checkout <nazwa brancha>
                

git merge

Scalamy branche


                $ git merge <nazwa brancha>
                

git remote

Zarz膮dzamy repozytoriami zdalnymi


                $ git remote
                

git pull

Pobieramy zmiany z repozytorium zdalnego


                $ git pull
                

git push

Przesy艂amy zmiany do repozytorium zdalnego


                $ git push
                

Tagi

Specjalne oznaczenie poszczeg贸lnych punkt贸w w historii repozytorium, kt贸re s膮 szczeg贸lnie wa偶ne.

Zazwyczaj wykorzystywane do oznaczania wydawanych wersji. Rozr贸偶niamy dwa typy tag贸w:

  • lightweight
  • annotated

            $ git tag -a v1.4 -m "my version 1.4"
            

HEAD

Wskazanie na miejsce w repozytorium (branch/commit) na kt贸rym si臋 "znajdujemy"


            ~/work/sages master *1 > cat .git/HEAD
            ref: refs/heads/master
            

Merge vs. rebase

git merge

Zalety

  • 艁atwe do zrozumienia i proste do wykonania.
  • Utrzymuje histori臋 commit贸w w czytelnej formie.
  • Pozwala na 艂atwe 艣ledzenie zmian w r贸偶nych ga艂臋ziach.

git merge

Wady

  • Tworzy dodatkowy commit scalania, kt贸ry mo偶e za艣mieca膰 histori臋 commit贸w.
  • Mo偶e prowadzi膰 do konflikt贸w scalania, kt贸re nale偶y r臋cznie rozwi膮za膰.

git rebase

Zalety

  • Przenosi zmiany z jednej ga艂臋zi na drug膮
  • Historia jest bardziej liniowa, chronologicznie
  • Pozwala na unikni臋cie konflikt贸w scalania.

git rebase

Wady

  • Mo偶e by膰 trudniejsze do zrozumienia i wykonania ni偶 merge.
  • Mo偶e prowadzi膰 do utraty informacji o historii commit贸w.
  • Nale偶y u偶ywa膰 go ostro偶nie w przypadku ga艂臋zi, kt贸re zosta艂y udost臋pnione innym osobom.

Commitowanie

Rozs膮dny podzia艂.

Commitujemy cz臋sto.

Nie commitujemy "w po艂owie".

U偶ywamy ga艂臋zi.

Nazwy commit贸w s膮 wa偶ne.

Na przyk艂ad:

  • "Dodano funkcj臋 X"
  • "Naprawiono b艂膮d Y"
  • "Zaktualizowano bibliotek臋 Z"

Rozwi膮zywanie konflikt贸w

Github Desktop

Instalacja na Ubuntu

Github Desktop

Instalacja na Windows

Link

Wykonywanie operacji znanych z terminala:

  • Klonowanie repozytorium
    git clone
  • Dodawanie plik贸w do "poczekalni"
    git add
  • Zatwierdzanie zmian
    git commit
  • Sprawdzanie statusu repozytorium
    git status

Wykonywanie operacji znanych z terminala:

  • Sprawdzanie statusu repozytorium
    git status
  • Przegl膮danie historii zmian
    git log
  • Por贸wnywanie zmian
    git diff
  • Przywracanie zmian
    git restore

Wykonywanie operacji znanych z terminala:

  • Przemieszczanie commit贸w
    git rebase
  • Scalanie ga艂臋zi
    git merge
  • Pobieranie zmian z repozytorium zdalnego
    git pull
  • Wysy艂anie zmian do repozytorium zdalnego
    git push

Git flow

  • master: Zawiera stabilny kod, gotowy do wydania.
  • develop: S艂u偶y do rozwijania nowych funkcji i testowania ich przed wydaniem.
  • feature: U偶ywane do tworzenia i testowania nowych funkcji.
  • release: S艂u偶y do przygotowania wersji do wydania.
  • hotfix: U偶ywane do naprawiania b艂臋d贸w w wydanych wersjach.

Podsumowanie

Najwa偶niejsze cechy Gita

Kontrola wersji

  • 艢ledzenie zmian w plikach i kodzie.
  • Mo偶liwo艣膰 przywracania poprzednich wersji.
  • Przegl膮danie historii zmian.

Wsp贸艂praca

  • Wsp贸lna praca nad projektami.
  • 艁膮czenie zmian z r贸偶nych ga艂臋zi.
  • Mo偶liwo艣膰 komentowania i recenzowania kodu.

Efektywno艣膰

  • U艂atwione zarz膮dzanie projektami.
  • Mo偶liwo艣膰 tworzenia i scalania ga艂臋zi.
  • Automatyzacja powtarzalnych zada艅.

Dost臋pno艣膰

  • Darmowy i otwarty kod 藕r贸d艂owy.
  • Dost臋pny na r贸偶nych platformach.
  • Du偶a spo艂eczno艣膰 u偶ytkownik贸w i programist贸w.

Dodatkowe materia艂y

git-scm.com Recording Changes to the Repository

git-scm.com Viewing the Commit History

git-scm.com Undoing Things