Programowanie Systemów Wbudowanych Wprowadzenie do Systemu Kontroli Wersji GIT ¹ródªo: git-scm.com dr in». Krzysztof Czarnecki Wydziaª Elektroniki,Telekomunikacji i Informatyki Politechnika Gda«ska 2015
Lokalne systemy kontroli wersji
Scentralizowane systemy kontroli wersji
Rozproszone systemy kontroli wersji
Krótka historia Git Do 2002 roku wszelkie zmiany kodu j dra Linuksa byªy przekazywane jako ªaty (ang. patches) i zarchiwizowane pliki. W 2002 roku wprowadzono system kontroli wersji tego projektu o nazwie DVCS BitKeeper. Spoªeczno± rozwijaj ca j dro Linuksa mogªa korzysta z niego nieodpªatnie. W 2005 roku pozwolenie na nieodpªatne u»ywanie systemu zostaªo cofni te. Stworzenie wªasnego DVCS na podstawie wiedzy wyniesionej z u»ywania BitKeepera (inicjatorem byª Linus Torvalds). Do celów tego nowego systemu nale»aªy: szybko± prosta konstrukcja wsparcie dla nieliniowego rozwoju (wielu równolegªych gaª zi) peªne rozproszenie wydajna obsªuga du»ych projektów Git ewoluowaª i ustabilizowaª si jako narz dzie ªatwe w u»yciu. Jest niewiarygodnie szybki, wydajny przy pracy z du»ymi projektami i posiada system gaª zi do nieliniowego rozwoju.
Inne systemy kontroli wersji sposób przechowywania plików
GIT sposób przechowywania plików
Cechy Git Niemal ka»da operacja jest lokalna du»a szybko± dziaªania mo»liwo± pracy oine mo»liwo± manipulowania prawami dost pu do plików Git ma wbudowane mechanizmy spójno±ci danych zabezpieczenie przed niepowoªanymi modykacjami w historii zmian zabezpieczenie przed przypadkowym uszkodzeniem pliku stosowanie mechanizmów kryptograi kluczy SHA-1 Standardowo Git wyª cznie dodaje nowe dane wszystkie zmiany s rejestrowane mo»liwo± utraty danych jest bardzo ograniczona
Podstawowe tryby w jakich mo»e znale¹ si plik
Instalacja GIT Zostaª zaprojektowany i w du»ej mierze zaimplementowany przez Linusa Torvaldsa i to si czuje. ródªa: http://git-scm.com/download ródªa: git clone git://git.kernel.org/pub/scm/git/git.git Debian: apt-get install git Fedora: yum install git-core Windows, OS X (Apple)...
Polecenia GIT add Add le contents to the index bisect Find by binary search the change that introduced a bug branch List, create, or delete branches checkout Checkout a branch or paths to the working tree clone Clone a repository into a new directory commit Record changes to the repository di Show changes between commits, commit and working tree, etc fetch Download objects and refs from another repository grep Print lines matching a pattern init Create an empty Git repository or reinitialize an existing one log Show commit logs merge Join two or more development histories together mv Move or rename a le, a directory, or a symlink pull Fetch from and integrate with another repository or a local branch push Update remote refs along with associated objects rebase Forward-port local commits to the updated upstream head reset Reset current HEAD to the specied state rm Remove les from the working tree and from the index show Show various types of objects status Show the working tree status tag Create, list, delete or verify a tag object signed with GPG
Konguracja GIT Pliki konguracyjne: /etc/gitcong (system), system /.gitcong (u»ytkownik), global.git/cong (projekt), local Przykªady: git cong global user.name "Jan Nowak" git cong global user.email jannowak@example.com git cong system core.editor emacs git cong local merge.tool vimdi git cong list git cong user.name
Pomoc do GIT Uzyskanie pomocy oine: git help <polecenie> git <polecenie> help man git man git <polecenie> Przykªad: git help cong
Inicjacja repozytorium GIT Utworzenie nowego pustego repozytorium: git init (lokalnie w bie» cym katalogu) git init bare (na serwerze w bie» cym katalogu) Po wykonaniu powy»szych polece«git init w bie» cym katalogu powinien zosta utworzony katalog.git zawieraj cy puste repozytorium GIT, pliki projektu powinny znajdowa si poza tym katalogiem. Skopiowanie istniej cego repozytorium ze zdalnego serwera: git clone git://github.com/project.git (kopiowanie z serwera github) git clone ssh://somehost.pl:/srv/project.git (kopiowanie z serwera ssh) Po wykonaniu powy»szych polece«git clone powinien zosta utworzony katalog project z repozytorium GIT oraz najnowsz wersj projektu. git clone git://github.com/project.git new-project. Tak jak git clone z t ró»nic,»e katalogowi zostanie nadana nazwa new-project.
Statusy plików
Rejestrowanie zmian w repozytorium GIT git add - rozpocz cie ±ledzenia plików (równie» dodanie plików do poczekalni) git rm - usuwanie plików z repozytorium GIT git status - sprawdzanie statusu plików git di - sprawdzanie zmian w plikach git commit - wprowadzanie zmian do repozytorium Polecenie git commit wymaga podania opisu wprowadzanych zmian. Raz dodane zmiany powinny pozosta w repozytorium ju» na zawsze, dlatego nale»y je wprowadza starannie. git commit a - wprowadzanie zmian do repozytorium z automatycznym dodaniem do poczekalni ±ledzonych plików, które zostaªy zmodykowane git commit amend - jedyna mo»liwo± modykacji ostatniej wprowadzonej lokalnie zmiany. Nie zaleca si modykacji starszych wersji GIT nie udost pnia prostych mechanizmów pozwalaj cych na takie modykacje.
Przykªadowy scenariusz (w powªoce bash) mkdir projekt cd projekt git init git cong local user.name "Programista X" echo "linia 1" > plik.txt git add plik.txt # repozytorium ±ledzi zmiany tylko jednego pliku git commit -a -m "Komentarz 1" echo "linia 2" > plik.txt git commit -a -m "Komentarz 2" echo "linia 3" >> plik.txt git commit -a -m "Komentarz 3" gitg # narz dzie gitg pozwala na przegl danie historii zmian # podobnie jak git log w trybie tekstowym
Zrzut ekranu dla scenariusza
Przegl danie zmian - git log git log pretty=oneline 51874295d21ebb62b762274422449e161ad4857a Komentarz 3 2f1e892602ed65f98362bad4824f8355a650a615 Komentarz 2 7d08a276f783a110d65d0c01ec9b98d2edb317de Komentarz 1 git log -p -1 commit 51874295d21ebb62b762274422449e161ad4857a Author: Programista X <krzycz@eti.pg.gda.pl> Date: Sun Mar 29 00:51:18 2015 +0100 Komentarz 3 di git a/plik.txt b/plik.txt index ce5eebd..1f2bd3d 100644 a/plik.txt + + + b/plik.txt @@ 1 +1,2 @@ linia 2 +linia 3
Cofanie zmian, tagowanie i wczytywanie poprzednich wersji projektu git checkout <nazwa-pliku> - cofanie zmian do ostatniej zachowanej wersji pliku <nazwa-pliku> git checkout <nazwa-wersji> - cofanie zmian do wybranej wersji projektu (zostanie zaktualizowany caªy katalog) nazwa wersji to nazwa gaª zi (np. master) git tag - wy±wietli wszystkie etykiety git tag -a <nazwa-etykiety> - dodawanie nowej etykiety git checkout <nazwa-etykiety> - wczytanie wersji opatrzonej etykiet git show <nazwa-etykiety> - wy±wietlenie informacji o wersji git tag -d <nazwa-etykiety> - usuwanie etykiety
Przykªadowy scenariusz (kontynuacja) git tag -a ver.1 -m "Wersja 1" echo "linia 4" >> plik.txt git commit -a -m "Komentarz 4" cat plik.txt linia 2 linia 3 linia 4 git checkout ver.1 cat plik.txt linia 2 linia 3
Zrzut ekranu dla scenariusza
git show ver.1 Przegl danie zmian - git show tag ver.1 Tagger: Programista X <krzycz@eti.pg.gda.pl> Date: Sun Mar 29 03:37:13 2015 +0200 Wersja 1 commit 51874295d21ebb62b762274422449e161ad4857a Author: Programista X <krzycz@eti.pg.gda.pl> Date: Sun Mar 29 00:51:18 2015 +0100 Komentarz 3 di git a/plik.txt b/plik.txt index ce5eebd..1f2bd3d 100644 a/plik.txt + + + b/plik.txt @@ 1 +1,2 @@ linia 2 +linia 3
Tworzenie, usuwanie i ª czenie lokalnych gaª zi GIT git branch - wypisuje list gaª zi git branch <nazwa-gaª zi> - dodawanie nowej gaª zi Po dodaniu nowej gaª zi nale»y si na ni przeª czy wydaj c polecenie git checkout <nazwa-gaª zi>. git branch -d <nazwa-gaª zi> - usuwanie gaª zi git branch -D <nazwa-gaª zi> - usuwanie gaª zi git merge <nazwa-gaª zi> - ª czenie gaª zi Aby zª czy 2 gaª zie nale»y si przeª czy na jedn z nich, a nast pnie wyda polecenie git merge z argumentem b d cym nazw drugiej gaª zi.
Przykªadowy scenariusz (kontynuacja) git branch test # utworzenie nowej gaª zi o nazwie test echo "linia 5" >> plik.txt git commit -a -m "Komentarz 5" # te zmiany zostan wª czone do gaª zi master git checkout test # dopiero po przeª czeniu si na gaª ¹ test... echo "linia 5 (test)" >> plik.txt git commit -a -m "Komentarz 1 w test" #... jest mo»liwe wprowadzanie zmian git checkout master # nowe kody z g. test chcemy wª czy do g. master git merge test # git stara si przeprowadzi ª czenie automatycznie <<<<<<< HEAD # mog jednak wyst pi konikty... linia 5 ======= linia 5 (test) >>>>>>> test #... które nale»y rozwi za r cznie git commit -a # je»eli wyst piªy konikty potrzebny jest commit
Zrzut ekranu dla scenariusza
Wysyªanie i pobieranie zmian z zewn trznego repozytorium GIT git clone - klonowanie zdalnego repozytorium Je»eli repozytorium zostaªo sklonowane z zewn trznego serwera, mo»e istnie mo»liwo± wysyªania zmian oraz aktualizacji tego repozytorium. git branch set upstream <nazwa-gaª zi> Nale»y pami ta,»e lokalne gaª zie trzeba powi za ze zdalnymi odpowiednikami oraz ustawi w tryb ±ledzenia git fetch - pobranie zmian z serwera - aktualizacja zdalnych gaª zi, których kopie przechowywane s lokalnie. git pull - pobranie zmian z serwera - aktualizacja zdalnych gaª zi oraz próba zª czenia ich lokalnych kopii z lokalnymi odpowiednikami. Prosz zwróci uwag,»e w zasadzie trywialny scenariusz ze zdalnym serwerem dotyczy sytuacji w której mog istnie, a» 3 wersje jednej gaª zi: lokalna, zdalna w lokalnym systemie plików oraz zdalna na serwerze. git push - wysyªanie zmian do zdalnego repozytorium Aby operacja si powiodªa nale»y najpierw zaktualizowa lokalny katalog.
Schowek GIT Je»eli programista wprowadziª zmiany w lokalnym repozytorium GIT, ale równolegle serwer zostaª zsynchronizowany z inn wersja projektu serwer nie przyjmie zmian i po wydaniu komendy git push zwróci bª d. Aby nie straci zmian a przy tym zaktualizowa lokalny katalog mo»na u»y komendy: git stash. Spowoduje ona przeniesienie wszystkich zmian od ostatniego wprowadzenia ich do repozytorium. Po tej operacji mo»na bezpiecznie zaktualizowa lokalny projekt git pull oraz nadpisa na nim zmiany ze schowka: git stash apply. Operacja ta mo»e wygenerowa konikty, które nale»y rozwi za r cznie podobnie jak to miaªo miejsce po wydaniu komendy git merge.
Dzi kuj za uwag krzycz@eti.pg.gda.pl