System Kontroli wersji GIT Rafał Kalinowski
Agenda Czym jest GIT? Modele pracy Możliwości GIT’a Kilka słów o terminologii Obiekty w GIT’ie? Struktura zmian Operacje zdalne i lokalne Podstawowe operacje Przykładowe wykorzystanie Kilka narzędzi dla GIT’a
Czym jest GIT System Kontroli Wersji Stworzony jako zastępstwo BitKeepera Linus Torvalds nazwał jego kolejny projekt właśnie jako GIT. ("I'm an egotistical bastard, and I name all my projects after myself. First 'Linux', now 'git'.„) Projekt miał opierać się na Szybkości Prostocie Wsparcie dla nieliniowego wytwarzania oprogramowania Całkowite rozproszenie Efektywnym przechowywaniu dużych projektów (np. kernel Linuksa) Open source (GNU General Public License, v2). Zbiór narzędzi
Modele pracy Model Scentralizowany Serwer Komputer Repozytorium Plik SVN CVS Perforce Używana jako miejsce przechowywania kopii zapasowej (Backupu) Brak prywatnych branch’y Do wykonania większości standardowych operacji wymaga połączenia do serwera. Serwer Komputer Plik Repozytorium Wersja 1 Wersja 2 Jeżeli padnie główny serwer?
Modele pracy c.d. Serwer Komputer Model Rozproszony Plik Wersja 1 Repozytorium Wersja 1 Wersja 2 Model Rozproszony GIT Mercurial Bazaar Możliwość pracy na wielu zdalnych repozytoriach. Wsparcie dla lokalnych/prywatnych branch’y. Nie potrzebuje dostępu do serwera dla większości operacji Pełna historia zmian dostępna lokalnie. Pierwsze pobranie repozytorium wymaga pobrania całej jego zawartości. Całe repozytorium musi być trzymane na dysku lokalnym.
Rozproszony model pracy Możliwości GIT’a Rozproszony model pracy Wsparcie dla nieliniowego programowania (branche) Wydajny w przypadku dużych projektów Publikacja repozytorium (git://, http(s)://, ssh://) Adresowanie przez zawartość (SHA-1) #24b9da (24b9da6552252987aa493b52f8696cd6d3b00373) Praca lokalna bez połączenia z repozytorium Większość operacji nie wymaga połączenia z serwerem.
Kilka słów o terminologii Branch - równoległa gałąź projektu rozwijana oddzielnie od głównej. Tag – marker konkretnej wersji (rewizja w SVN’ie) projektu. Working Dir – katalog roboczy na którym pracujemy Index – rodzaj „cache”, czyli miejsca gdzie trzymane są zmiany do commita Master Branch – główny branch z którym łączymy (merge) nasze zmiany przed wysłaniem do zdalnego repozytorium.
Obiekty GIT’a Commit – wskazuje na tree oraz ojca, zawiera przykładowo takie informacje jak autor, data i treść wiadomości. Tree – reprezentuje stan pojedynczego katalogu (lista obiektów blob oraz zagnieżdżonych obiektów tree) Blob – zawiera zawartość pliku bez żadnej dodatkowej struktury Tag – wskazuje na konkretny commit oraz zawiera opis taga.
Obiekty GIT’a cd. Komenda w gicie „> git gc” służy do czyszczenia i optymalizacji repozytorium. Jednym z jej zadań jest usunięcie nieosiągalnych obiektów oraz kompresja wersji obiektów.
Struktura zmian w GIT’ie Przechowywanie zawartości projektu jako „snapshot’ów”. Kompresowanie zawartości projektu. Zmiany w czasie Wersja 1 Wersja 2 Wersja 3 Wersja 4 Plik A A A1 Plik B B B1 Plik C C1 C2
Przykładowymi operacjami zdalnymi są: Operacje zdalne Przykładowymi operacjami zdalnymi są: git clone – pobiera zdalne repozytorium do podanego folderu git fetch – pobiera obiekty i wskaźniki z innego repozytorium git pull – pobiera i integruje obiekty i wskaźniki z innego repozytorium git push – aktualizuje zdalne repozytorium o wskaźniki i powiązane obiekty.
Katalog gita (folder .git) Operacje lokalne Większość operacji wykonywanych jest na lokalnym repozytorium. Katalog gita (folder .git) Index Working Directory checkout add commit
git init – stworzenie nowego repozytorium Podstawowe operacje git init – stworzenie nowego repozytorium git add – dodanie zawartości pliku do Index’u git rm – usuwa plik z indexu (plik zniknie z working directory po commit’ie) git mv – przenosi plik git status – pokazuje status katalogu roboczego i poczekalni git config – pobiera i ustawia opcje globalne GIT’a lub tylko repozytorium git config --global merge.tool <nazwa_toola>
Podstawowe operacje cd. git commit – zapisuje zmiany do repozytorium lokalnego git log – wyświetla logi z commit’ów git show – wyświetla obiekt git fetch – pobiera zmiany z repozytorium zdalnego git pull – wywołuje polecenia fetch i merge git push – wysyła zmiany do zdalnego repozytorium
Podstawowe operacje cd. git branch – do zarządzania branch’ami git checkout – przełączanie się między branch’ami git merge – łączy podane branch’e git rebase – zmienia punkt startu dla branch’a git reset – przywraca stan katalogu roboczego git stash – zapisuje/odczytuje zmiany z przestrzeni tymczasowej (rodzaj schowka) git gc – porządkowanie i optymalizacja repozytorium
Prezentacja wykorzystania Stworzenie zdalnego repozytorium : > git init Dodanie nowych plików: > git add . > git add readme.txt Struktura projektu. (Plik .git/config) > git config
Prezentacja wykorzystania cd. Pierwszy commit: > git commit -m „Treść wiadomości” Historia : > git log
Prezentacja wykorzystania Stworzenie tag’a: > git tag v1.00 > git tag v2.00 -m „Wersja druga” Wypisanie tagów: > git tag Wysłanie do zdalnego repozytorium tagów: > git push -tags Usunięcie taga: > git tag -d v2.00 Git push origin :refs/tags/v.2.00
Prezentacja wykorzystania Tworzenie brancha: > git branch myBranch Wyświetlenie branchy: > git branch Przełączanie branchy: > git checkout myBranch Usuwanie brancha: > git branch –d myBranch Git push origin :heads/nazwa_brancha
Prezentacja wykorzystania Łączenie (merge) branchy: > git merge branchName W przypadku konfliktów po poprawkach w łatwy sposób można kontynuować pracę: >git commit -a -m „Merge branchy” Konflikty są podobnie rozwiązane jak jest to zrobione w SVN. Opcja -a podana przy komendzie commit powoduje, że wszystkie pliki istniejące w Indexie zostaną zaczytane z Working Direcotory, natomiast pozostałe zostaną usunięte.
Prezentacja wykorzystania Historia zmian: > git log > git log --after=22.06.2014.19:20 > git log <nazwa_pliku> Wyszukiwanie odpowiedzialnej osoby: > git blame <nazwa_pliku> > git blame –L 12,3 <nazwa_pliku>
GIT i SVN Migracja do GIT’a: > git svn clone <svn_url> Praca na kopii repozytorium SVNa w GIT’ie: > git svn rebase > git svn dcommit
Przykładowe narzędzia: GIT Gui GIT Bash GIT History TortoiseGIT Eclipse eGIT GITHub Stash (Attlasian) Gerrit http://gerrit.aokp.co/#/c/17020/
Tworzenie i łączenie (merge) branch’y jest szybkie i łatwe. Podsumowanie Tworzenie i łączenie (merge) branch’y jest szybkie i łatwe. Możliwość wymiany kodu pomiędzy zdalnymi repozytoriami. (Udostepnienie bezpośrednio dla kogoś swojego prywatnego branch’a) Łatwe prototypowanie. (Prywatne branche) Można w łatwy sposób dostosować repozytoria do swojego procesu wytwarzania kodu. Możliwość automatycznego migrowania repozytorium SVN do GIT’a. Projekt OpenSource Rosnąca popularność dzięki której pojawaia się coraz więczej narzędzi/pluginów do/dla GIT’a. (Przykład: Główne repozytorium projektu jest w trybie read. Każdy zespół developerów ma swoje zdalne repozytorium do którego zapisuje(commit’uje) zmiany, następnie lider zespołu sprawdza je i łączy (merguje) z kolenym repozytorium wyżej. I tak aż do momentu kiedy osoba odpowiedzialna za główne repozytorium udostępni je na głównym repozytorium.
Pytania ?