5. 5
O co biega? Git
VCS – System Kontroli Wersji
● Offline
● Szybki
● Elastyczny
● Dla power-userów
6. 6
O co biega? Git
A wady?
● Command Line
● Dużo do opanowania na początek
● To nie SVN
● Zróżnicowany poziom trudności
7. 7
Cel
● Nacisk na podstawy
● Solidna baza do pogłębiania wiedzy
● Kontrola nad tym co się dzieje
8. 8
Szybki start
GNU/Linux
Package Manager
● git
● gitk
● git-gui
● meld
Windows
http://git-scm.com/
Mac OS X
Instalowany razem
z Xcode i narzędziami
Inne narzędzia: Sourcetree
9. 9
Konfiguracja
$ git config --global <klucz> <wartość>
user.name
user.email
core.editor
color.ui
merge.tool
“Jan Kowalski”
jkowalski@example.com
vim
auto (domyślne od 1.8.4)
meld
11. 11
Git Offline - Repozytorium
1. Projekt bez kontroli wersji
2. Import do Git'a
3. Repozytorium
status
init
12. 12
Git Offline - Workflow
Wprowadzanie zmian Przygotowanie do “zdjęcia”
Staging
Snapshot
Commit
13. 13
Git Offline - Staging i Index
1. Jak zapisuje się zmiany?
2. Dodawanie, usuwanie
i przywracanie plików
3. Commit (snapshot)
status
add
rm
mv
commit
reset
checkout
14. 14
Git Offline - Staging i Index
Working Directory Stage / Index
? ?
Nowo utworzone repozytorium
$ git status
untracked
15. 15
Git Offline - Staging i Index
Working Directory Stage / Index
Dodanie zmian (stage)
$ git add <file>
added
16. 16
Git Offline - Staging i Index
Working Directory Stage / Index
Stan po zrobieniu commita
$ git commit
17. 17
Git Offline - Staging i Index
Working Directory Stage / Index
Kolejne zmiany
$ git status
?
R
to be removed
untracked
18. 18
Git Offline - Staging i Index
Working Directory Stage / Index
$ git rm $ git add
added
removed
19. 19
Git Offline - Staging i Index
Working Directory Stage / Index
Wycofanie pliku (unstage)
$ git reset -- <file>
?
removed untracked
20. 20
Git Offline - Staging i Index
Working Directory Stage / Index
added
modified
removed
M
Modyfikacja po dodaniu zmian
.gitignore
21. 21
Git Offline - Staging i Index
Checkout Reset
Reset --hard
Albo:
git-gui
NB: Git nie jest w stanie zapisać pustego katalogu
22. 22
Git Offline - Commit
1. Commit pod lupą
2. Historia zmian (log)
3. gitk
commit
log
23. 23
Git Offline - Commit
Commit =
zmiany + metadane
● commit hash
● komunikat (message)
● zmiany
● hash poprzedniego
commita(ów) (parent)
● autor, commiter,
data/godzina
Ważne: Commit jest niemodyfikowalny
Raz utworzony commit zostaje w repo na zawsze*
24. 24
Nic
Git Offline - Kilka commitów - log
czas
#1
#2
#3
init
pierwszy commit
drugi
trzeci
25. 25
Git Offline - Log i Branch
$ git log
$ gitk
Branch - to “etykietka” przypięta
do najnowszego commita.
Active branch - to branch, “na którym”
tworzymy nowe commity.
26. 26
Git Offline - Nawigacja
master
master~1
master~2
master~3
#0
#1
#2
#3
HEAD
HEAD~1
HEAD~2
HEAD~3
HEAD~
HEAD~~
HEAD~~~
eb32a79
HEAD^
HEAD^^
HEAD^^^
Poleceniem git diff można zobaczyć zmiany
wprowadzone od wskazanego commita.
27. 27
Git Offline - Szybka korekta
Amend - używamy, gdy chcemy poprawić
ostatni commit.
przed po
a
b
c
a1
b
c
a
master master
master
$ git commit --amend
31. 31
Branching - Dlaczego?
● Porządkowanie pracy (feature/topic branch)
● Eksperymentowanie
● Elastyczność (bugfix vs development)
● Bo to szybkie i wygodne
NB: Stash - szybka alternatywa dla branch+commit
33. 33
Branching - Polecenia
1. Tworzenie nowego brancha
2. Zmiana aktywnego brancha
3. Dodanie i usunięcie
commitów
4. Zmiana nazwy i usunięcie
brancha
status
checkout
branch
reset
34. 34
Branching - Log i diff
e
foo bar
c
d
a
b
$ git log foo a, b, e, ...
$ git log bar c, d, e, ...
$ git log foo..bar c, d
$ git log bar..foo a, b
$ git log foo bar
$ git log bar foo
a, b, c, d, e, ...
$ git log foo...bar
$ git log bar...foo
a, b, c, d
$ git diff foo..bar
$ git diff foo bar a -> c
$ git diff bar..foo
$ git diff bar foo
c -> a
$ git diff foo...bar e -> c
$ git diff bar...foo e -> a
35. 35
Branching - Scalanie branchy
Merge Rebase
● Nigdy nie zmienia historii
● Tworzy nowy commit
łączący branche
● Rozgałęzienie w logu jest
widoczne po merge'u
● Zmienia historię
(podmienia oryginalne commity)
● Log ulega “wyprostowaniu”
(commity są “przenoszone” na
docelowy branch)
Uwaga: Scalanie zawsze zaczynamy od usunięcia zmian
w katalogu roboczym (git status)
36. 36
Branching - Konflikty
Modyfikacja tego samego pliku (usunięcie, zmiana
tych samych linii, etc.)
/**
* Add two floating point values.
*/
public double add(double a, double b) {
<<<<<<< HEAD
// TODO cba to implement this atm...
throw new UnsupportedOperationException();
=======
return a + b;
>>>>>>> foobar
}
Unmerged paths:
both modified: math.java
$ git status
37. 37
Branching - Merge
przed po
c
e
a
b
d
master
foobar
master
1) $ git checkout master
2) $ git merge foobar
c
e
a
b
d
master
foobar
f
38. 38
Branching - Fast-forward Merge
przed po
c
d
a
b
master
foobar
master
1) $ git checkout master
2) $ git merge foobar
c
d
a
b
master foobar
39. 39
Branching - Merge - konflikt
c
e
a
b
d
master
foobar
f
math.java:
throw new Exception...
math.java:
return a + b;
Konflikt: math.java
1. Konflikty ze wszystkich commitów rozwiązujemy
w tym samym miejscu - merge commit.
2. Poprawiamy, dodajemy do stage'a i wykonujemy commit.
40. 40
Branching - Rebase
przed po
a
e
b
d
master
foobar foobar
1) $ git checkout foobar
2) $ git rebase master
c
a
e
b
d
master
foobar
c
b1
d1
41. 41
Branching - Rebase - konflikt
a
e
b
d
master
foobar
c
math.java:
throw new Exception...
math.java:
return a + b;
utils.java
Dodano metodę
utils.java
Usunięty - nie używany
1. Rebase przenosi po kolei commity z foobar na master
2. Dla każdego kolejnego commita może wystąpić nowy konflikt
3. Przebieg rebase'a kontrolujemy poleceniem
$ git rebase (--continue | --skip | --abort)
Konflikt
42. 42
Branching - 3-way diff
OURS a
e
b
d
master
foobar
c
THEIRS
BASE
/**
* Add two floating point
*/
public double add(double a,
<<<<<<< HEAD
// TODO cba to impleme
throw new UnsupportedO
=======
return a + b;
>>>>>>> foobar
}
BACKUP - conflicted
/**
* Add two floating point va
*/
public double add(double a,
return 0.0; // TODO
}
/**
* Add two floating point va
*/
public double add(double a,
// TODO cba to implement
throw new UnsupportedOpe
}
/**
* Add two floating point va
*/
public double add(double a,
return a + b;
}
OURS / LOCAL THEIRS / REMOTE
BASE
$ git mergetool
43. 43
Branching - Rebase #2
przed po
e
g
c
d
master
foo
f
a
b
bar
e
g
c
d
master
f
a
b
bar
a1
b1
c1
d1 bar
foo
1) $ git checkout bar
2) $ git rebase master
44. 44
Branching - Rebase #2
przed po
e
g
c
d
master
foo
1) $ git rebase --onto master foo bar
$ git rebase -i master
f
a
b
bar
e
g
c
d
master
foo
f
a
b
bar
a1
b1 bar
45. 45
Branching - Tips & Tricks
● $ git mergetool
● $ git clean (-n | -f | -rf)
● $ git checkout --conflict=diff3 -- <plik>
● $ git reset --hard ORIG_HEAD
● $ git reflog
● konflikty plików binarnych -- unikać :-)
● “merge” bez zachowania historii -- squash
● rebase interaktywny (rebase -i) może też:
odrzucić lub zmienić kolejność commitów, squashować
46. 46
Branching - Podsumowanie
● Master branch
● Feature / topic / etc. branch
● Merge commit
● Rebase
● Konflikt / 3-way diff / mergetool
● Commit jest niezmienny i nie “ginie”
● NB: interactive rebase / squash merge i inne
51. 51
Remotes - Klonowanie
1. Pobranie repozytorium
2. Wyświetlanie branchy
3. Informacje o remote
clone
branch
status
remote
52. 52
Remotes - Local vs Remote
Różnice między local i remote branchem:
1. Branch zdalny nie może być aktywny
2. Na branch zdalny nie da się commitować
NB: Branch zdalny nie aktualizuje się “automatycznie”
a
b
c
master remotes/origin/master
53. 53
Remotes - Pobieranie zmian
a
b
master r../origin/master
1) $ git fetch
$ git fetch (<remote> | --all)
2) $ git merge origin/master
a
b
master
r../origin/master
c
d
przed po
r../origin/mas..
54. 54
Remotes - Pobieranie zmian #2
a
b
master r../origin/master
1) $ git checkout master
2) $ git pull origin master
$ git pull
a
b
master r../origin/master
c
d
przed po
r../origin/master
master
NB: Często użycie pull kończy się merge'm,
którego nie chcieliśmy.
55. 55
Remotes - Wysyłanie zmian
1) $ git push origin master
$ git push origin lokalny:zdalny
przed po
c
d
master r../origin/master
a
b
remotes/origin/master
c
d
master
remotes/origin/master
a
b
56. 56
Remotes - Force push
1) $ git push --force origin lokalny:zdalny
przed po
d
c
master
r../origin/master
a
b
d
c
master r../origin/master
a
b
r../origin/master
NB: Wykonując force push, upewnij się, że inne
osoby też pozbędą się odrzuconych commitów
62. 62
Linki / Dokumentacja
● Oficjalna dokumentacja: Reference, Git Book
http://git-scm.com/doc
● Różne tutoriale i poradniki
https://help.github.com/articles/good-resources-for-learning-git-a
nd-github/