Systemy kontroli wersji Sebastian Wojczyk wojczyk@math.uni.lodz.pl
Plan wykładu Kilka dat z historii, Przydane pojęcia, Do czego służą systemy kontroli wersji, Architektury systemów kontroli wersji, Najbardziej znane systemy kontroli wersji, System kontroli wersji GIT, Ogólne informacje, instalacja, konfiguracja, Tworzenie repozytorium, Statusy i cykl życia plików, Praca z repozytorium lokalnym, Praca z repozytorium zdalnym,
Rys historyczny 1969 – system UNIX, 1972 – język C, 1976 – diff, 1982 – RCS, 1983 – język C++, 1986 – patch, 1986 – CVS, 1991 – system Linux, 2000 – SVN, 2000 – język C#, 2003 – system Linux – jądro w wersji 2.6, 2005 – GIT,
Definicja System kontroli wersji - oprogramowanie służące do śledzenia zmian głównie w kodzie źródłowym oraz pomocy programistom w łączeniu zmian dokonanych w plikach przez wiele osób w różnych momentach czasowych. Repozytorium - miejsce uporządkowanego przechowywania dokumentów (definicja ogólna), w przypadku systemów kontroli wersji miejsce przechowywania plików wraz z informacjami o wszystkich zarejestrowanych zmianach, Rewizja/Wersja - stan plików po wykonaniu określonej liczby zmian, każda operacja zapisu do repozytorium tworzy nową rewizję, Kopia robocza – kopia plików (najczęściej początkowo pobrana z repozytorium) służąca bieżącej pracy. Kopia robocza jest w pełni prywatna. Dokonane w niej zmiany mogą być zapisane do repozytorium.
Główne zadania Przechowuje bieżący stan projektu, Pomaga synchronizować pracę grupy programistów, Przechowuje historię zmian w projekcie, Pozwala przeglądać historię zmian projektu, Automatyzuje wiele czynności programistów, Porównywanie plików, Śledzenie zmian: zakres zmian, czas wprowadzenia, autora, Ułatwia zarządzanie wydaniami i wersjami projektu, Umożliwia tworzenie gałęzi projektu, Ułatwia poszukiwanie błędów.
Systemy lokalne
Systemy scentralizowane
Systemy rozproszone
Narzędzia wspomagające diff – program komputerowy działający w konsoli, wyświetlający różnice między dwoma plikami tekstowymi na poziomie poszczególnych wierszy. Ukazuje które wiersze występują w obu plikach, a które są unikalne. wiersze wspólne dla porównywanych plików nie są oznaczane, wiersze występujące tylko w pierwszym pliku są oznaczane -, wiersze występujące tylko w drugim pliku są oznaczane +, Czasami znaki -/+ zamieniane są na znaki >/<, wdiff – wersja diff operująca na pojedynczych słowach, patch – program komputerowy działający w konsoli, służący do zakładania/nakładania patchy (łat, łatek).
Popularne systemy RCS Revision Control System Kontrola zmian w pojedynczych plików, Możliwość opisu każdej zmiany, Możliwość śledzenia i przeglądania zmian, Rozgałęzianie wersji (ang. branching), Scalanie wersji (ang. merging), Automatyczne porównywanie i scalanie plików, Praca nad projektem w jednej lokalizacji (system lokalny), Podstawowe blokowanie dostępu (ang. locking),
Popularne systemy CVS Concurrent Versions System Podstawowe funkcje wzięte jak w RCS, Zarządzanie dużymi projektami (tysiące plików), Równoległa praca nad tymi samymi plikami, Synchronizacja równoczesnych zmian przez wielu autorów, Centralne repozytorium dla całego projektu, Decentralizacja i rozproszenie pracy autorów, Synchronizacja repozytoriów z użyciem sieci, Złożona konfiguracja i zarządzanie repozytorium,
Popularne systemy SVN Subversion Rejestruje historię dodatkowych informacji o pliku, nazwa, atrybuty, położenie, Dodatkowe dowolnie zdefiniowane atrybuty, Obsługa historii folderów, Atomowość transakcji na wielu plikach, Śledzenie operacji na plikach: Tworzenie, Kopiowanie, Przenoszenie, Zmiana nazwy, Usuwanie, Implementacja w postaci modułu serwera Apache (dostępność),
Popularne systemy GIT Rozproszenie systemu – każde repozytorium jest pełnowartościowe, Przyspieszenie pracy przy dużych projektach (większość operacji to praca lokalna), Prostota konstrukcji, Dwustopniowa historia plików (lokalna i globalna), Możliwość pracy offline (na lokalnym repozytorium), Możliwość edycji zmian (opis, dodanie czy wyłączenie pliku), Możliwość wycofywania zmian,
Przechowywanie historii zmian RCS CVS SVN Git
GIT – instalacja System dedykowany dla systemu Linux, Można korzystać pod Windows Emulator Linux (Cygwin), Konsola bash, Podstawowe GUI Uruchamiane menu kontekstowym w katalogu repozytorium, Strona domowa projektu http://git-scm.com/
GIT – wstęp git config user.name "Jan Nowak" git config user.email "jan@domena.pl" Ustawia identyfikator użytkownika i adres mailowy, Informacje służące do określania autorów zmian w repozytorium, Opcja --global pozwala zrobić te ustawienia dla całego systemu, git config user.name Wyświetla aktualną nazwę użytkownika, git config --list Wyświetla aktualną pełną konfigurację repozytorium, git help <polecenie> Wyświetla tekst pomocy dla polecenia (w przeglądarce).
GIT – tworzenie repozytorium git init Inicjuje nowe repozytorium w bieżącej lokalizacji, Tworzy katalog .git który przechowuje repozytorium, git add plik1.cc Dodanie pojedynczego pliku do poczekalni, git add *.cs Dodanie grupy plików do poczekalni zgodnie z wyrażeniem, git add –all Dodanie wszystkich plików do poczekalni, git commit -m ’zainicjowane repozytorium’ Zapisanie do repozytorium wszystkich plików wcześniej dodanych do poczekalni ze wskazanym komentarzem, git clone protokół://adres Klonowanie istniejącego repozytorium, Protokoły: git, http, https, uzytkownik@serwer (z użyciem ssh)
GIT – statusy plików Pliki nieśledzone, Pliki śledzone, Pliki których nie chcemy zapamiętywać i śledzić ich historii, Pliki tymczasowe, Kopie zapasowe plików, Pliki śledzone, Niezmodyfikowane, Zawartość zgodna z ostatnio zapamiętaną w repozytorium wersją, Zmodyfikowane, Zawartość zmieniona w stosunku do ostatnio zapamiętanej w repozytorium wersji, W przechowalni, Plik oznaczony jako gotowe do zapisania w następnej wersji,
GIT – cykl życia plików git status Sprawdzenie statusu plików
GIT – pliki nieśledzone Pliki które nie są analizowane przez GITa (nie dodane do śledzenia), Można wymusić ignorowanie pewnych plików Pliki konfiguracyjne do ignorowania plików lub katalogów, .git/info/exclude .gitignore Nazwy konkretnych plików, Nazwy konkretnych katalogów, Nazwy ścieżkowe „od bieżącego katalogu”, Wyrażenia regularne do nazw plików i katalogów, *.bak – wszystkie pliki „bak” w bieżącym katalogu, /bak/* – wszystkie pliki w katalogu bak /bak/** – wszystkie pliki w katalogu bak i jego podkatalogach **/*.bak – wszystkie pliki „ bak” w dowolnym podkatalogu Można negować wyrażenia rozpoczynając znakiem !
GIT – pliki śledzone git add <plik> git diff Dodanie nowych plików do śledzenia i do poczekalni, Dodanie już śledzonych plików do poczekalni (w chwili wykonania polecenia), git diff Pokazuje różnice pomiędzy śledzonymi plikami a poczekalnią/repozytorium, git diff <plik> Pokazuje różnice pomiędzy wskazanym plikiem a poczekalnią/repozytorium, git diff HEAD <plik> Pokazuje różnice pomiędzy wskazanym plikiem roboczym a repozytorium, git diff HEAD^ <plik> Pokazuje różnice pomiędzy wskazanym plikiem roboczym a repozytorium (poprzednia wersja), git diff --cached lub git diff --staged Pokazuje różnice pomiędzy plikami z poczekalni a repozytorium, git rm <plik> Usuwa fizycznie plik z dysku i przekazuje operację usunięcia do poczekalni, git rm --cached lub git rm --staged Usuwa plik z plików śledzonych i przekazuje operację usunięcia do poczekalni; nie usuwa fizycznie pliku z dysku (przydatne gdy chcemy plik np. ignorować), git mv <old> <new> Zmienia nazwę pliku na nową i przekazue operację zmiany do poczekalni równoważne z ciągiem pleceń „mv <old> <new>; git rm <old>; git add <new>”,
GIT – zatwierdzanie zmian git commit Wysyła do repozytorium pliki z poczekalni, git commit –v Dodatkowo w komentarzu dodaje pełnego diffa zmienionych plików, git commit –a Pomija poczekalnię i dodaje do repozytorium wszystkie zmodyfikowane śledzone pliki, git commit –m ’ tekst’ Z linii komend pozwala ustalić tekst komentarza dla zapisu do repozytorium.
GIT – przegląd historii git log Listuje wszystkie zmiany w kolejności od najnowszych do najstarszych, git log <plik> Listuje zmiany dotyczące wskazanego pliku w kolejności od najnowszych do najstarszych, git log -p Opcja -p dodatkowo wyświetla diff dla każdej zmiany, git log -3 Opcja -3 wyświetla tylko 3 ostatnie wpisy, git log --stat Opcja --stat wyświetla statystyki zmian Ilości plików zmienionych, dodanych, usuniętych, Ilości nowych „wstawek” i „usunięć” w plikach (diff), git log --author Wyświetla zmiany danego autora,
GIT – przegląd historii 2 git log --pretty=oneline Wyświetla skróty i komentarze do kolejnych rewizji, git log --pretty=format:"%ar : %s" Wyświetla raport w zadanym formacie (ar – autor, s – komentarz), Dostępnych wiele innych predefiniowanych zmiennych, git log --since=2.weeks Wyświetla zmiany z ostatnich dwóch tygodni, git log --since="2000-01-01" –until="2005-12-31" Wyświetla zmiany z zadanego okresu, I wiele innych opcji
GIT – wycofywanie zmian git reset HEAD <plik> Usunięcie pliku z poczekalni (teraz jest tylko śledzony), git checkout <plik> Przywrócenie pliku do stanu z ostatniej rewizji (ostatni commit), git checkout HEAD^ <plik> Przywrócenie pliku do stanu z przed-ostatniej rewizji, git checkout HEAD^^ <plik> Przywrócenie pliku do stanu z przed-przed-ostatniej rewizji, git commit --amend Ponowienie operacji commit z uwzględnieniem aktualnej poczekalni; Jeśli w poczekalni nic się nie zmieniło to tylko możliwość zmiany komentarza,
GIT – zdalne repozytoria git remote Wyświetla nazwy zarejestrowanych zdalnych repozytoriów, git remote -v Wyświetla nazwy zdalnych repozytoriów i ich pełne URL-e, git remote add <nazwa> <url> Dodaje nowy wpis do listy zdalnych repozytoriów, git push Wypycha zmian z lokalnego do zdalnego repozytorium git fetch Pobiera zmiany ze zdalnego do lokalnego repozytorium git pull Pobiera zmiany ze zdalnego do lokalnego repozytorium i dodatkowo scala je (merge) z naszą kopią roboczą,
GIT – bibliografia Scott Chackon, Pro Git, http://git-scm.com/book Dokumentacja systemu GIT