Git
Czyli jak nie narobi膰 馃挬 w repozytorium
Rozproszony system kontroli wersji to narz臋dzie, kt贸re pozwala na:
- 艢ledzenie wszystkich zmian dokonywanych w plikach: Mo偶esz zobaczy膰, kto, kiedy i co zmieni艂 w
danym pliku.
- Mo偶liwo艣膰 przywr贸cenia poprzedniej wersji pliku: Je艣li pope艂nisz b艂膮d lub zechcesz wr贸ci膰 do
wcze艣niejszej wersji pliku,
mo偶esz to zrobi膰 bez problemu.
- Wsp贸艂dzielenie plik贸w z innymi: Mo偶esz udost臋pnia膰 swoje pliki innym osobom i pracowa膰 nad nimi
wsp贸lnie.
- 艁膮czenie zmian dokonywanych w plikach przez wiele os贸b w r贸偶nym czasie: System automatycznie
po艂膮czy zmiany wprowadzone
przez r贸偶nych u偶ytkownik贸w, nawet je艣li pracowali oni nad tymi samymi plikami w tym samym czasie.
- Obs艂uga du偶ych projekt贸w: System jest skalowalny i mo偶e obs艂ugiwa膰 nawet bardzo du偶e projekty.
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
Rozproszony system kontroli wersji to narz臋dzie, kt贸re pozwala na:
- 艢ledzenie wszystkich zmian dokonywanych w plikach: Mo偶esz zobaczy膰, kto, kiedy i co zmieni艂 w
danym pliku.
- Mo偶liwo艣膰 przywr贸cenia poprzedniej wersji pliku: Je艣li pope艂nisz b艂膮d lub zechcesz wr贸ci膰 do
wcze艣niejszej wersji pliku,
mo偶esz to zrobi膰 bez problemu.
- Wsp贸艂dzielenie plik贸w z innymi: Mo偶esz udost臋pnia膰 swoje pliki innym osobom i pracowa膰 nad nimi
wsp贸lnie.
- 艁膮czenie zmian dokonywanych w plikach przez wiele os贸b w r贸偶nym czasie: System automatycznie
po艂膮czy zmiany wprowadzone
przez r贸偶nych u偶ytkownik贸w, nawet je艣li pracowali oni nad tymi samymi plikami w tym samym czasie.
- Obs艂uga du偶ych projekt贸w: System jest skalowalny i mo偶e obs艂ugiwa膰 nawet bardzo du偶e projekty.
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.
Migawki (snapshots)
Git przechowuje dane w postaci migawek, czyli obraz贸w ca艂ego projektu w danym momencie. Za
ka偶dym razem, gdy wprowadzamy
zmian臋 do projektu i zatwierdzamy j膮 (commit), Git tworzy now膮 migawk臋, kt贸ra zawiera:
Spis wszystkich plik贸w w projekcie: Git zapisuje nazw臋, rozmiar i sum臋 kontroln膮 ka偶dego pliku.
Drzewo katalog贸w: Git zapisuje struktur臋 katalog贸w w projekcie.
Tre艣膰 ka偶dego pliku: Git zapisuje tre艣膰 ka偶dego pliku, kt贸ry zosta艂 zmieniony od ostatniej
migawki.
Zalety przechowywania danych jako migawek:
Efektywno艣膰: Git nie musi przechowywa膰 ca艂ej historii zmian dla ka偶dego pliku. Zamiast tego
przechowuje tylko r贸偶nice
mi臋dzy kolejnymi migawkami.
Integralno艣膰: Migawki s膮 odporne na uszkodzenia. Je艣li jedna migawka ulegnie uszkodzeniu,
pozosta艂e pozostan膮
nienaruszone.
艁atwo艣膰 dost臋pu: Mo偶emy 艂atwo przegl膮da膰 i przywraca膰 dowoln膮 migawk臋.
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
Stany plik贸w w Gicie:
1. Zmodyfikowany:
Plik jest zmodyfikowany, je艣li jego zawarto艣膰 uleg艂a zmianie od ostatniego zatwierdzenia
(commit). Zmodyfikowane pliki
nie s膮 艣ledzone przez Gita i nie s膮 cz臋艣ci膮 repozytorium.
2. 艢ledzony:
Plik jest 艣ledzony, je艣li jest cz臋艣ci膮 repozytorium i jego zmiany s膮 monitorowane przez Gita.
艢ledzone pliki mog膮 by膰
zmodyfikowane lub niezmodyfikowane.
3. Zatwierdzony:
Plik jest zatwierdzony, je艣li jego zmiany zosta艂y zapisane w repozytorium. Zatwierdzone pliki s膮
niezmienne i nie mo偶na
ich modyfikowa膰 bez utworzenia nowej wersji.
Przej艣cia mi臋dzy stanami:
Zmodyfikowany -> 艢ledzony: Plik staje si臋 艣ledzony, gdy dodamy go do repozytorium za pomoc膮
polecenia git add.
艢ledzony -> Zmodyfikowany: Plik staje si臋 zmodyfikowany, gdy jego zawarto艣膰 ulegnie zmianie.
Zmodyfikowany -> Zatwierdzony: Plik staje si臋 zatwierdzony, gdy zatwierdzimy zmiany za pomoc膮
polecenia git commit.
Zatwierdzony -> 艢ledzony: Zatwierdzone pliki nie mog膮 zosta膰 zmienione bez utworzenia nowej
wersji.
Dodatkowe stany:
Nie艣ledzony: Plik nie jest 艣ledzony przez Gita i nie jest cz臋艣ci膮 repozytorium.
Zignorowany: Plik jest ignorowany przez Gita i nie jest 艣ledzony ani dodawany do repozytorium.
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
Ustawienia to偶samo艣ci w Git okre艣laj膮, jak b臋dziemy identyfikowani w commitach i innych
operacjach Git. Sk艂adaj膮 si臋 na
nie dwa g艂贸wne elementy:
Nazwa u偶ytkownika:, czyli identyfikator, kt贸ry b臋dzie wy艣wietlany w commitach i innych
operacjach
Git. Domy艣lnie jest ona ustawiana na nazw臋 u偶ytkownika Twojego konta systemowego.
Adres e-mail, czyli adres, na kt贸ry b臋d膮 wysy艂ane powiadomienia o commitach i innych
operacjach.
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:
$ 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
Polecenie git merge 艂膮czy zmiany z dw贸ch ga艂臋zi w jedn膮. Git tworzy nowy commit, kt贸ry 艂膮czy
zmiany z obu ga艂臋zi.
Historia commit贸w staje si臋 liniowa, ale zawiera dodatkowy commit scalania.
Polecenie git rebase przenosi commity z jednej ga艂臋zi na drug膮. Git przepisuje histori臋
commit贸w, tak aby commity z
jednej ga艂臋zi wygl膮da艂y, jakby by艂y wykonane na drugiej ga艂臋zi.
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".
Rozs膮dny podzia艂:
Dziel du偶e zmiany na mniejsze, 艂atwiejsze do zarz膮dzania commity.
Ka偶dy commit powinien zawiera膰 logicznie powi膮zane zmiany.
U艂atwi to 艣ledzenie zmian i rozwi膮zywanie problem贸w.
2. Commitujemy cz臋sto:
Nie czekaj z commitowaniem do momentu zako艅czenia ca艂ego projektu.
Commituj regularnie, aby zachowa膰 histori臋 zmian i m贸c 艂atwo si臋 do niej cofn膮膰.
U艂atwi to r贸wnie偶 wsp贸艂prac臋 z innymi osobami.
3. Nie commitujemy "w po艂owie":
Nie commituj niesko艅czonych lub niestabilnych zmian.
Commity powinny zawiera膰 tylko uko艅czone i przetestowane zmiany.
Zapobiegnie to problemom z kompilacj膮 i dzia艂aniem projektu.
U偶ywamy ga艂臋zi.
Nazwy commit贸w s膮 wa偶ne.
4. U偶ywamy ga艂臋zi:
U偶ywaj ga艂臋zi do izolowania r贸偶nych zmian.
Ga艂膮藕 master powinna zawiera膰 tylko stabilne i gotowe do wydania zmiany.
Inne ga艂臋zie mog膮 s艂u偶y膰 do testowania nowych funkcji lub eksperymentowania.
5. Nazwy commit贸w s膮 wa偶ne:
U偶ywaj kr贸tkich i opisowych nazw commit贸w.
Nazwa commitu powinna odzwierciedla膰 wprowadzone zmiany.
U艂atwi to wyszukiwanie i zrozumienie historii commit贸w.
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
Gitflow to model przep艂ywu pracy, kt贸ry pomaga w zarz膮dzaniu repozytoriami Git w spos贸b
zorganizowany i wydajny. Opiera
si臋 na u偶yciu ga艂臋zi do izolowania r贸偶nych etap贸w rozwoju projektu.
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.
1. Nowa funkcja jest tworzona w ga艂臋zi feature.
2. Po zako艅czeniu funkcji ga艂膮藕 feature jest scalana z ga艂臋zi膮 develop.
3. Ga艂膮藕 develop jest regularnie testowana i integrowana z ga艂臋zi膮 master.
4. Kiedy nowa wersja jest gotowa do wydania, ga艂膮藕 develop jest scalana z ga艂臋zi膮 release.
5. W ga艂臋zi release s膮 tworzone tagi i artefakty wydania.
6. Wydanie jest publikowane z ga艂臋zi release.
7. B艂臋dy w wydanych wersjach s膮 naprawiane w ga艂臋ziach hotfix, a nast臋pnie scalane z ga艂臋ziami
master i develop.
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.