Adam Wójs <adam[shift+2]wojs.pl> git --wprowadzenie
Życie programisty A) Rozwój projektu B) Naprawianie błędów C) Refaktoryzacja kodu
Ekstremalny przykład Wersja jądra Lb-a programistów Lb-a linii kodu 2.6.38 1,198 14,211,814 2.6.39 1,258 14,537,764 3.0 1,131 14,651,135 3.1 1,168 14,776,002 3.2 1,316 15,004,006 Źródło: http://storage.pardot.com/6342/48856/lf_kernel_development_2012.pdf
Co to jest system kontroli wersji? System kontroli wersji (ang. version/revision control system) jest to oprogramowanie służące do śledzenia zmian głównie w kodzie źródłowym oraz pomocy programistom w łączeniu i modyfikacji zmian dokonanych przez wiele osób w różnych momentach. Źródło: http://pl.wikipedia.org/wiki/system_kontroli_wersji
Git jest system kontroli wersji.
Co to jest github? github to hosting repozytoriów git z dodatkowymi narzędziami i elementami social network.
Narzędzia które dostarcza github Collaboration, Wiki, Issue Tracking, Code Review, Code Hosting, Activity Streams, Developer Profiles, Explore GitHub
Teoria i praktyka pracy z repozytorium
Rozpoczęcie pracy Inicjalizacja nowego repozytorium $ git init Klonowanie istniejącego repozytorium $ git clone <repository> <directory>
Konfiguracja Podpis autora zmiany: $ git config --global user.name <username> E-mail autora zmiany: $ git config --global user.email <email>
Pliki w repozytorium Praca w lokalnym repozytorium odbywa się w trzech obszarach:
Pierwsza rewizja $ touch main.cc # Tworzymy plik $ git status $ git add main.cc $ git status $ git commit -m Moj pierwszy commit $ git log /* main.cc */ int main(int argc, char* argv[]) { return 0; }
Sprawdzanie stanu plików Sprawdzenie bieżącego stanu repozytorium: $ git status
# On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: menu.cc # new file: menu.h # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: main.cc # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # Makefile
Staging area (Poczekalnia) Śledzenie nowego pliku $ git add <filepattern> Zmiana nazwy / usuniecie pliku z repozytorium $ git mv <source> <destination> $ git rm <filepattern>
Zatwierdzanie zmian Zmiany zatwierdzamy za pomocą: $ git commit Zostaniemy poproszeni o podanie opisu wprowadzonej modyfikacji. Każda rewizja identyfikowana jest za pomocą sumy kontrolnej SHA-1.
Dziennik zmian Wyświetlanie dziennika zmian projektu $ git log
Edycja ostatniej rewizji $ # Zatwierdźmy modyfikacje main.cc $ git add main.cc $ git commit -m Hello World $ /* main.cc */ #include <iostream> int main(int argc, char* argv[]) { std::cout << Hello World << std::endl; return 0; }
Edycja ostatniej rewizji $ # Poprawiamy main.cc $ git diff main.cc $ git add main.cc $ git commit --amend /* main.cc */ #include <iostream> int main(int argc, char* argv[]) { std::cout << Hello Git << std::endl; return 0; }
Różnice w plikach Wyświetlanie różnic między aktualną wersją plików a wersją z poczekalni $ git diff <file> Wyświetlanie różnic między aktualną wersją plików a ostatnio zatwierdzoną wersją $ git diff --cached <file>
Cofanie modyfikacji $ # Modyfikujemy nasz projekt $ git add main.cc $ git status $ git checkout -- main.cc $ git status Cofanie wprowadzonych zmian (ale nie zatwierdzonych) $ git checkout -- <file>
Cofanie rewizji Cofanie rewizji i pozostawienie zmian. $ git reset --soft <commit> Cofanie rewizji i usunięcie zmian z rewizji. $ git reset --hard <commit>
Usuwanie pliku z poczekalni Usuwanie pliku dodanego do poczekalni $ git reset <file> Wprowadzone zmiany nie zostaną usunięte
Rozgałęzienia Git pozwala na tworzenie rozgałęzień kodu źródłowego. Zarządzanie rozgałęzieniami: $ git branch
Tworzenie gałęzi Tworzenie oraz przejście do nowej gałęzi $ git branch <name> $ git checkout <name> lub w krótszej wersji $ git checkout -b <name>
Scalanie gałęzi Do scalania gałęzi służy polecenie $ git merge <name> Podczas scalania gałęzi może dojść do konfliktów, które będzie trzeba rozwiązać ręcznie.
Rozwiązywanie konfliktów $ git checkout -b test $ # Modyfikacja main.cc $ git add main.cc $ git commit -m Hello Git form test $ git checkout master $ # Modyfikacja main.cc $ git add main.cc $ git commit -m Hello Git from master $ git merge test Auto-merging main.cc CONFLICT (content): Merge conflict in main.cc Automatic merge failed; fix conflicts and then commit the result.
Rozwiązywanie konfliktów Scalenie gałęzi nie powiodło się ponieważ obie rewizje zawierają modyfikacje tej samej linii. $ # Ręczna edycja plików zawierających konflikty $ git add. $ git commit
Praca z zdalnymi repozytoriami Zarządzanie zdalnymi repozytoriami $ git remote Dodanie zdalnego repozytorium $ git remote add <name> <url>
Zaciąganie zmian z zdalnego repozytorium Ściągniecie zmian z zdalnego repozytorium $ git fetch <repository> Ściągniecie i scalenie zmian z zdalnego repozytorium $ git pull <repository>
Zaciąganie zdalnej gałęzi Pobieranie do lokalnego repozytorium zdalnej gałęzi: $ git fetch <repository> $ git checkout track <repository>/<branch>
Wypychanie zmian do zdalnego repozytorium Wypychanie zmian do zdalnego repozytorium $ git push Wypychanie zmian i utworzenie gałęzi w zdalnym repozytorium $ git push -u <repository> <branch>
Pytania?
Linki Pro Git Książka dostępna: http://git-scm.com/book Try Git Interaktywny tutorial: http://try.github.com
Dziękuje za uwagę.