GIT
Kilka dni temu miałem przyjemność poprowadzić w firmie wewnętrzne szkolenie/wstęp do Gita.
BTW, za swój osobisty sukces uważam fakt, że już po pierwszym miesiÄ…cu pracy dostaÅ‚em szansÄ™ “oficjalnego” zaprezentowania zajebistoÅ›ci Gita programistom chÅ‚ostanym dotychczas bezlitoÅ›nie przez TFSowÄ… kontrolÄ™ wersji witkami z doczepionymi haczykami na ryby po osolonych plecach. Efekt byÅ‚ dość prosty do przewidzenia: podobaÅ‚o siÄ™.
Poniżej wrzucam swoją listę tematów do poruszenia. Moim zdaniem są to najważniejsze elementy do pokazania w sensownym czasie nieprzekraczającym połowy dnia pracy, gdzie zostaje jeszcze sporo luzu na eksperymentowanie i demonstrowanie na żywo pewnych najczęściej spotykanych scenariuszy. Może ta lista posłuży komuś do wyjścia w swojej firmie z podobną inicjatywą, czyli zaprezentowania Gita szerszemu gronu? Gitersi wszystkich firm, łączmy się;).
Co to jest Git i dlaczego jest lepszy niż TFS:
- rozproszony system kontroli wersji
- każdy ma swoje pełne repozytorium
- diff/log/… – wszystko lokalnie
- commity – też lokalnie
- komunikacja z centralnym serwerem (jedna z możliwości podzielenia się kodem z zespołem)
- pull – pobranie najnowszego kodu
- push – wysÅ‚anie wÅ‚asnych commitów
- “remotes” – linki do zdalnych repozytorium
- gałęzie
- gałąź “główna” – master
- lokalne gałęzie – caÅ‚kowita swoboda w poruszaniu siÄ™ i organizacji pracy
- żadnych exclusive locks
- świetny merge
- śledzi zawartość plików, a nie pliki
- stÄ…d automatyczne wykrywa np. rename
- (blog) Git – rozproszony system kontroli wersji (DVCS) – krótkie omówienie i garść linków
- (blog) W czym Git jest lepszy od TFS?
Komendy do poruszania siÄ™ po gicie:
- pull – Å›ciÄ…ga kod z centralnego serwera i łączy z naszym
- push – wysyÅ‚a nasz kod (lokalne commity) na centralny serwer
- checkout
- po podaniu nazwy gałęzi: przełącza working copy między gałęziami
- z flagÄ… ‘-b’ – tworzy nowÄ… gałąź
- po podaniu nazwy pliku: Å›ciÄ…ga plik z podanej wersji (bez podania wersji – Å›ciÄ…ga z ostatniego commita -> usuwa “niezacommitowane” zmiany)
- branch
- listuje aktualne gałęzie
- z flagÄ… ‘-d’ – usuwa gałąź o podanej nazwie
- help: git [command]–help
- (blog) Git – poczÄ…tek – pierwsze kroki po instalacji gita
Indeks (“staging area”):
- miejsce między working copy a commitem
- “cache” zmian, które znajdÄ… siÄ™ w nastÄ™pnym commicie
- pozwala na bardzo dokładną kontrolę nad tym co zostanie zacommitowane
- można dowolnie manipulować zawartością indeksu, np zapisując tam tylko część pliku do commita
Komendy do working copy, indeksu i commitów:
- add – dodanie zmian do indeksu
- add -A – dodanie wszystkich zmian do indeksu
- add -i – interactive add, dokÅ‚adna kontrola nad tym co zostanie dodane do indeksu
- add -i -> patch – dodawanie części zmian z danego pliku do indeksu
- commit – stworzenie commita z aktualnego stanu indeksu
- pierwsza linijka w commit msg – krótki opis, potem pusta linia, potem ew. dÅ‚uższy opis – tip dla narzÄ™dzi wyÅ›wietlajÄ…cych logi
- clean – czyszczenie plików ‘untracked’
- reset – czyszczenie indeksu
- reset –hard – czyszczenie indeksu i working copy, coÅ› jak “undo pending changes”
- stash – zachowanie aktualnych zmian na później, poza indeksem i poza commitami (coÅ› jak shelve, tylko lokalnie)
Struktura commitów
- lokalne commity – lista podzielona na gałęzie
- każdy commit jednoznacznie identyfikowany SHA1 ID
- każdy commit można otagować
- ostatni commit w gałęzi to HEAD
- merge tworzy “merge commit” bÄ™dÄ…cy dzieckiem dwóch commitów
- można zrobić merge bez tego, ale nie ma sensu w to teraz wnikać
- można dowolnie nawigować się pomiędzy commitami (znając jego ID, nazwę bądź położenie relatywne do innego znanego commita, np końcówki gałęzi)
- git checkout master^ – 1 commit przed HEAD master
- git checkout master~4 – 4 commity przed HEAD master
Modyfikacja historii:
- commit –amend – modyfikacja ostatniego commita
- rebase – “naÅ‚ożenie” jednej gałęzi na drugÄ… gałąź
- rebase -i – interactive rebase
- reword
- edit
- squash
- …
- NIE WOLNO modyfikować historii już wysłanej na serwer (!!!)
- standardowo git nie pozwoli tego zrobić, jeÅ›li wysyÅ‚amy do innego repo gita…
- … ale nie wiem jak zachowa siÄ™ TFS
- (blog) Modyfikacja historii w Gicie
Git-TFS:
- workflow:
- [master]
- git tfs pull – mamy najnowszy kod z repo
- git checkout -b our-branch-name – tworzymy gałąź do bieżących prac
- git add/commit… – pracujemy
- git add/commit… – pracujemy
git add/commit… – pracujemy
- git checkout master – powracamy do gałęzi głównej
- git tfs pull – Å›ciÄ…gamy najnowszy kod (w [master]zawsze mamy kod bez swoich modyfikacji)
- git checkout our-branch-name – wracamy na naszÄ… gałąź
- git rebase master – “nakÅ‚adamy” naszÄ… gałąź na najnowszy kod z TFS (ew. radzimy sobie z merge – mi siÄ™ tutaj jeszcze nie zdarzyÅ‚o żebym musiaÅ‚ to robić)
- wysyłamy zmiany do TFS
- git tfs rcheckin -w [task id]– wypychamy nowe commity z naszej gałęzi do TFSa mówiÄ…c z jakim taskiem ma skojarzyć; commit messages zostanÄ… umieszczone jako komentarz do checkina
- dziaÅ‚anie “pod spodem”: push jednego commita -> pull -> rebase -> …
- może kilka chwil potrwać
- git tfs checkintool –build-default-comment
- łączy wszystkie commity w jeden
- git tfs rcheckin -w [task id]– wypychamy nowe commity z naszej gałęzi do TFSa mówiÄ…c z jakim taskiem ma skojarzyć; commit messages zostanÄ… umieszczone jako komentarz do checkina
- git checkout master – powracamy do gałęzi głównej
- git tfs pull – Å›ciÄ…gamy do [master]a nasze zmiany (plus ewentualnie inne które wydarzyÅ‚y siÄ™ w tym czasie)
- git branch -d our-branch-name – kasujemy naszÄ… gałąź, nie jest już potrzebna (możemy skasować bo wszystkie zmiany z niej sÄ… w masterze, inaczej git by na to nie pozwoliÅ‚)
- (blog) git-tfs – lek na prawie caÅ‚e zÅ‚o
Narzędzia:
- git bash (z aliasami gita lub autohotkeys)
- demo użycia
- (blog) Skrypt AutoHotkey ułatwiający pracę z Git
- tortoise git
- używam do logów i diffów z total commandera
- dla mnie osobiście najwygodniejsze
- gitk
- wbudowany log-viewer
- pokazuje stan indeksu vs stan working copy
- dla mnie mimo wszystko żółwik jest wygodniejszy
- git gui
- wbudowany ‘okienkowy klient’ do kontaktu z gitem
- przydaje mi siÄ™ tylko gdy odpalam raz na jakiÅ› czas żeby zobaczyć czy pora na ‘cleanup’
- sugeruje uruchomienie git gc jeśli jest taka potrzeba
- git extensions for visual studio
- testowałem dawno temu, ale okazało się że tego nie potrzebuję
- VS jest wystarczająco wolny bez dodatkowych obciążeń
- testowałem dawno temu, ale okazało się że tego nie potrzebuję
- git source control provider
- nie testowaÅ‚em, ale j/w – nie potrzebujÄ™; poza tym dodaje okna ‘pending changes’ etc… których nie chcÄ™
- nawigacja po narzÄ™dziach – u mnie
- [win]+1 – total cmd (menu -> l -> enter = view log)
- [win]+2 – vs
- [win]+3 – git bash
Wow-factor:
- git bisect – identyfikacja commita powodujÄ…cego błąd w systemie, na przestrzeni dÅ‚ugiej historii [blog]
- git cherry-pick – przenoszenie jednego commita pomiÄ™dzy gałęziami
- git reflog – historia WSZYSTKICH operacji
Linki:
- Git http://git-scm.com/
- Tortoise Git http://code.google.com/p/tortoisegit/
- Git-tfs https://github.com/git-tfs/git-tfs
- Git – dokumentacja http://git-scm.com/documentation
- Git – tutorial http://schacon.github.com/git/gittutorial.html
- Git community book http://book.git-scm.com/
- Why Git is Better than X – trochÄ™ tendencyjne, ale prawdziwe
- A successful Git branching model – dos-ko-na-Å‚y post o jednej z możliwych strategii korzystania z gałęzi w Gicie; bardzo ciekawa lektura