System kontroli wersji

Paweł Mleczko

Wydział Matematyki i Informatyki UAM

O czym będziemy mówić?

  • Czym jest GIT?
  • Jak działa GIT?
  • Podstawowe komendy
  • Środowiska pracy
  • Zewnętrzne repozytoria

Czym jest i do czego służy GIT?

GIT jest rozproszonym systemem kontroli wersji pozwalający na kontrolę nad plikami, historią ich zmian

i osobami je modyfikujących.

Typowe (?) użycie programu GIT

Trzech przyjaciół pracuje nad pewnym dokumentem. Praca odbywa się w sposób zdalny.

 

W jaki sposób mogą koordynować

i kontrolować swoją pracę?

Kto korzysta z programu GIT

Wszyscy ci, którzy pracują w zespole nad wspólnym projektem, m.in.:

  • programiści (m.in twórcy Androida, GIMP-a, jQuery, Linux-a, Symfony)
  • autorzy książek lub artykułów
  • twórcy materiałów edukacyjnych.

Czy każdy plik może być dodany do repozytorium?

Tak, ale użyteczność GIT-a najlepiej sprawdza się przy pracy z plikami tekstowymi!

Zalety stosowania programu do kotroli wersji

  • umożliwia współpracę z wieloma osobami
  • ułatwia zarządzanie projektami
  • porządkuje i strukturyzuje pracę
  • zapewnia bezpieczeństwo (np. możliwość cofania zmian)

Twórca programu

Linus Torvalds
(ur. 1969), fiński programista, twórca m.in. jądra Linuksa.

Zasady działania programu

Słownik pojęć

  • repozytorium – określony zbiór plików, najczęściej jeden projekt
  • commit (lub rewizja) – jest to proces potwierdzenia (opisania) zmian
  • pull / push – odpowiednio pobranie i wysłanie zmian (jednego  lub wielu commitów) z/do repozytorium
  • diff – wskazanie różnicy pomiędzy różnymi rewizjami
  • branch – odgałęzienie, wersja wewnątrz repozytorium, pozwala na prace wielu osobom równocześnie
  • merge – połączenie wielu zmian z różnych źródeł

Stany, w których mogą znajdować się pliki

Gałęzie

Podstawowe komendy

Zaprezentujemy podstawowe możliwości GIT-a na przykładzie testowego repozytorium utworzonego w serwisie GitHub https://github.com/pml-pml/nidn2017

Konfiguracja

$ git config --global user.name "Imię Nazwisko"
$ git config --global core.editor nano
$ git config --global user.email jannowak@example.com

Tworzenie repozytorium (lokalnie)

$ git init

Klonowanie repozytorium

git clone 'repozytorium'

na przykład

$ git clone git@github.com:pml-pml/nidn2017.git
Cloning into 'nidn2017'...
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.

Sprawdzanie statusu plików

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        lorem.txt

nothing added to commit but untracked files present (use "git add" to track)

Dodawanie plików do repozytorium

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   lorem.txt
$ git add lorem.txt

Opisywanie zmian

$ git commit -m "dodanie pliku z fragmentem lorem ipsum"
[master ff54873] dodanie pliku z fragmentem lorem ipsum
 1 file changed, 1 insertion(+)
 create mode 100644 lorem.txt
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

Wypychanie zmian na serwer

$ git push
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 566 bytes | 566.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:pml-pml/nidn2017.git
   f05826b..ff54873  master -> master
$ git push
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 566 bytes | 566.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:pml-pml/nidn2017.git
   f05826b..ff54873  master -> master

Ściąganie zmian ze zdalnego repozytorium

$ git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:pml-pml/nidn2017
   ff54873..6faf81e  master     -> origin/master
Updating ff54873..6faf81e
Fast-forward
 lorem.txt | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
$ git pull

Łączenie zmian

$ git push
Username for 'https://github.com': pml-pml
Password for 'https://pml-pml@github.com': 
To https://github.com/pml-pml/nidn2017.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/pml-pml/nidn2017.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Łączenie zmian

$ git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/pml-pml/nidn2017
   6faf81e..a54bb68  master     -> origin/master
Auto-merging lorem.txt
CONFLICT (content): Merge conflict in lorem.txt
Automatic merge failed; fix conflicts and then commit the result.

Łączenie zmian

Łączenie zmian

Łączenie zmian

Kontrola zmian

$ git log
commit 1c173d64cf80e2a8cfb7b22ff76f891f23c329cd (HEAD -> master, origin/master, origin/HEAD)
Merge: 03195c9 a54bb68
Author: Paweł Mleczko <pml@amu.edu.pl>
Date:   Tue Oct 24 12:59:01 2017 +0200

    rozwiązanie konfliktu wyróżnienie/podkreślenie

commit 03195c925dcd30085d7cd52a663499eec99e5f2b
Author: Paweł Mleczko <pml@amu.edu.pl>
Date:   Tue Oct 24 12:51:01 2017 +0200

    wyróżnienie drugiego słowa w pierwszym akapicie

commit a54bb68b97338505cd6ac7d8f258bf275b37086e
Author: Paweł Mleczko <pml@amu.edu.pl>
Date:   Tue Oct 24 12:49:16 2017 +0200

    podkreślenie drugiego słowa w pierwszym akapicie

commit 6faf81e39188194c53200ba1352a88effb8bb439
Author: Paweł Mleczko <pml@amu.edu.pl>
Date:   Mon Oct 23 17:24:30 2017 +0200

    dopisanie drugiego akapitu

Wskazywanie ostatniej zmiany

$ git show
commit 1c173d64cf80e2a8cfb7b22ff76f891f23c329cd (HEAD -> master, origin/master, origin/HEAD)
Merge: 03195c9 a54bb68
Author: Paweł Mleczko <pml@amu.edu.pl>
Date:   Tue Oct 24 12:59:01 2017 +0200

    rozwiązanie konfliktu wyróżnienie/podkreślenie

,,Powrót'' do wcześniejszego punktu

$ git log
commit 1c173d64cf80e2a8cfb7b22ff76f891f23c329cd (HEAD -> master, origin/master, origin/HEAD)
Merge: 03195c9 a54bb68
Author: Paweł Mleczko <pml@amu.edu.pl>
Date:   Tue Oct 24 12:59:01 2017 +0200

    rozwiązanie konfliktu wyróżnienie/podkreślenie

commit 03195c925dcd30085d7cd52a663499eec99e5f2b
Author: Paweł Mleczko <pml@amu.edu.pl>
Date:   Tue Oct 24 12:51:01 2017 +0200

    wyróżnienie drugiego słowa w pierwszym akapicie


$ git log
commit 1c173d64cf80e2a8cfb7b22ff76f891f23c329cd (HEAD -> master, origin/master, origin/HEAD)
Merge: 03195c9 a54bb68
Author: Paweł Mleczko <pml@amu.edu.pl>
Date:   Tue Oct 24 12:59:01 2017 +0200

    rozwiązanie konfliktu wyróżnienie/podkreślenie

commit 03195c925dcd30085d7cd52a663499eec99e5f2b
Author: Paweł Mleczko <pml@amu.edu.pl>
Date:   Tue Oct 24 12:51:01 2017 +0200

    wyróżnienie drugiego słowa w pierwszym akapicie


$ git reset --hard 1c173d64cf80e2a8cfb7b22ff76f891f23c329cd

Środowiska pracy

Omówimy typy:

  • linię komend (podstawa)
  • graficzne środowiska (np. TortoiseGit, qGit)
  • dobre edytory tekstu wspierają GIT-a

Linia komend

$ git clone git@github.com:pml-pml/nidn2017.git
Cloning into 'nidn2017'...
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.

GUI

Zwykle można wykonywac komendy GIT-a z poziomu menu kontekstowego

Dobre praktyki

  • zrozumiałe opisywanie commitów
  • osobna gałąź do tworzenia danej funkcjonalności
  • wysyłanie do zewnętrznego repozytorium gotowych i działających fragmentów (np. funkcjonalności)

Gdzie przechowywać repozytoria?

Przedstawimy:

 

Ocenimy powyższe serwisy z punktu widzenia prostoty użytkowania i możliwości tworzenie za darmo prywatnych repozytoriów.

Gdzie przechowywać repozytoria?

https://github.com/

plusy

  • przyjazny dla użytkowników, bardzo popularny

minusy

  • bezpłatnie tylko publiczne repozytoria

Gdzie przechowywać repozytoria?

https://bitbucket.org/

plusy

  • darmowe prywatne repozytoria dostępne tylko dla małych zespołów (do pięciu użytkowników)

minusy

  • problemy ze stabilnością, współpraca z większą ilością użytkowników kosztuje

Gdzie przechowywać repozytoria?

https://gitlab.com/

plusy

  • nieograniczona ilość darmowych i prywatnych repozytoriów

minusy

  • problemy z szybkością działania serwisu, bywa niestabilny

Gdzie przechowywać repozytoria?

https://git.wmi.amu.edu.pl/

plusy

  • darmowy, również repozytoria prywatne za darmo

minusy

  • dostępny dla osób posiadających konto w domenie LABS

Https czy ssh?

  • ssh, jeśli zamierzamy korzystać z logowania bez hasła i linii komend
  • https w innym przypadku (https jest też polecane np. przez GitHub)

Co robić gdy przestaje działać?

Gdzie szukać informacji?

Co poza GIT-em?

Między innymi:

 

Zwykle te programy i usługi nie pozwalają śledzić zmian

i kontrolować wersji plików.

 

 

GIT

By Pawel Mleczko

GIT

An introduction to GIT (in Polish). Materiały do przedmiotu Narzędzia informatyki dla nauczycieli. Wersja 1.0.

  • 1,174