git kata

git workshops in kata format

init faq registration agenda poster

Agenda

Start time Kata
11:00
Opening
11:30
Git rebase (Wojtek Erbetowski)
Submodules (Paweł Cesar Sanjuan Szklarz)
Configs/aliases (Jakub Nabrdalik)
Pull & push options (Mateusz Grzechociński)
Branches and tags (Mateusz Harasymczuk)
Git filter-branch (Grzegorz Kubiak)
12:20
Manipulating commits (Jakub Nabrdalik)
Git flow (Michał Bareja)
Refspec (Mateusz Grzechociński)
Merging and rebasing (Mateusz Harasymczuk)
USB workflow (Łukasz Siwiński)
Rescue stash (Kamil Trzciński)
Undoing changes (Marcin Zajączkowski)
13:10
Submodules (Paweł Cesar Sanjuan Szklarz)
Pull & push options (Michał Bareja)
Git rerere (Mateusz Grzechociński)
Git internals (Mateusz Harasymczuk)
Git bisect (Grzegorz Kubiak)
Git-svn (Kamil Trzciński)
Rescue stash (Marcin Zajączkowski)
13:50
Lunch
14:50
Interactive rebase (Jakub Nabrdalik)
Undoing changes (Michał Bareja)
Fish shell (Mateusz Grzechociński)
Merging and rebasing (Mateusz Harasymczuk)
Git rebase (Grzegorz Kubiak)
Configs/aliases (Łukasz Siwiński)
Reset vs. revert (Marcin Zajączkowski)
15:40
Interactive rebase (Wojtek Erbetowski)
Submodules (Paweł Cesar Sanjuan Szklarz)
Configs/aliases (Jakub Nabrdalik)
Git flow (Michał Bareja)
Git bisect (Grzegorz Kubiak)
GitHub (Łukasz Siwiński)
Rescue stash (Kamil Trzciński)
16:30
Interactive rebase (Jakub Nabrdalik)
Git flow (Michał Bareja)
Undoing changes (Mateusz Grzechociński)
Branches and tags (Mateusz Harasymczuk)
USB workflow (Łukasz Siwiński)
Patches (Kamil Trzciński)
Manipulating commits (Marcin Zajączkowski)
17:20
Submodules (Paweł Cesar Sanjuan Szklarz)
Git internals (Jakub Nabrdalik)
Git rerere (Mateusz Grzechociński)
Merging and rebasing (Mateusz Harasymczuk)
Git filter-branch (Grzegorz Kubiak)
Git-svn (Kamil Trzciński)
Reset vs. revert (Marcin Zajączkowski)

Kata descriptions (Polish)

Git rebase

Motywacja

Rebase pozwala na zwinne manipulacje commitami w grupach. Można sobie poradzić bez tej komendy, umieszczając ręcznie odpowiednie commity w innych miejscach, lecz z rebasem zmienia się całe nasze podejście do Gita. Dla nieznających tego polecenia to "must"

Scenariusz

Zaczniemy od dwóch branchy. Przeniesiemy sobie kilka commitów w inne miejsce i spowrotem. Zmienimy przy okazji labelki (branche). Następnie poznamy sytuacje skrajne, czyli np przeniesienie brancha na samego siebie.


Git submodules

Motywacja

Kiedy rozwijamy aplikacji i uzywamy zewnatrznej biblioteki (open source albo poprostu oddzielny projekt wewnatrz naszej firmy) czesto mamy problem zaleznosci wersji. Nie chcemy czekac na kolejny release biblioteki zeby rozwinac aplikacji. Wtedy mozemy zintegrowac ta biblioteke do naszego repo jaki submodule i granulacje zaleznosci sprowadzic do konkrentych commitow: commit X aplikacji zalezy od commitu Y biblioteki.

Scenariusz

Startujemy z osobnej aplikacji i dwie biblioteki. Zintegrujemy biblioteki jaki submoduly i uzalezniamy sie od konkrentego builda. Zrobimy kilka przebiegow modyfikacji: tylko apka, tylko biblioteki, branche rownolegle dla app/biblioteki. Na koniec skazujemy biblioteki i wrocimy do zaleznosci od konkrentego release biblioteki.


Configs, handful aliases, other tips & tricks

Motywacja

Siadasz obok człowieka, żeby zrobić jakiś pair-programming albo generalnie pomóć mu w gicie, i patrzysz jak się męczy. Albo jak twierdzi że git to tylko z IDE. Zwykle znaczy to, że nie skonfigurował sobie środowiska. Git jest naprawdę dobrze zbudowany, ale człowiek który napisał te całe ""UI"" miszczem usability nie był (to nie Torvalds, Torvalds zrobił bebechy). W związku z tym, trzeba czasem sobie trochę pomóć i o tym będzie ta kata.

Scenariusz

Zaczniemy od zawartości .git/config, ustwienia kim jestem per projekt, kolorków, i domyślnego edytora, a potem pojedziemy z aliasami, różnymi fajnymi i nie tylko.


Pull & push options (push current/tracking branches, pull with rebase)

Motywacja

Czemu git pull czasami robi merge'a a czasami nie? Jak go zmusić, aby zamiast merge'a robił rebase? Czemu jak wypycham zmiany z mojego branche'a to razem z nim wypychane są wszystkie zmiany z pozostałych branche'y? Ta kata wyjaśni domyślne zachowania gita i pokaże jak je zmienić

Scenariusz

Kata będzie podzielona na dwie części: push i pull. Zaczniemy od testowania różnych konfiguracji wybierania branche'y które mają być wypchnięte. Nauczymy się jak tworzyć zdalne branche na serwerze. W drugiej części sprawdzimy kiedy git pull kończy się commitem merge'ującym oraz jak możemy go zmusić do rebase'owania


Branche i tagi

Motywacja

Czym są branche? Jak tworzone i reprezentowane są tagi i inne obiekty w GIT? Co czyni go takim wyjątkowym i jak się to ma do pozostałych systemów kontroli wersji.

Scenariusz

Zapoznamy się z obiektami reprezentującymi tagi, branche i commity w GIT. Nauczymy się jak się je tworzy, zarządza, merguje i jak najlepiej stworzyć drzewko w naszym repozytorium.


Git filter-branch

Motywacja

Chcesz upublicznić swój projekt z całą historią commitów? Niestety zawiera ona dane, których nie możesz udostępnić, takie jak adresy e-mail albo nieopatrznie zamieszczone hasła. Co wtedy? Wtedy możesz zmienić swoją historię za pomocą git filter-branch.

Scenariusz

Na przykładach zobaczymy w działaniu filtry dostępne w komendzie filter-branch. Za ich pomocą "masowo" przepiszemy historie specjalnie przygotowanych gałęzi.


Manipulating commits with amend and cherry-pick

Motywacja

Zapomniałem zacommitować jeden plik? Zrobiłem literówkę w komentarzu? Przed dokonaniem pusha możemy szybko to naprawić w sposób wygodniejszy niż z poleceniem reset. Jak utrzymując stabilny branch wydaniowy zbierać tylko poprawki bezpieczeństwa z mastera? Jak szybko pożyczyć jeden commit od kolegi? Na co trzeba wtedy uważać.

Scenariusz

Zaczniemy od amend i tego co oferuje i w jakich sytuacjach się sprawdza. Potem spróbujemy użyć i zrozumieć do czego jest cherry-pick biorąc jeden z commitów z innego brancha. Potem zobaczymy kilka w akcji. Na koniec porozmawiamy o tym kiedy NIE WOLNO tak robić.


Git-flow

Motywacja

Wszyscy wiemy jak zrobić commit na branchu i wypushować go remote repo. Ale jak poradzić sobie z kilkoma branchami? Co gdy do jednego repo commituje wielu developerów którzy pracują nad różnymi nowymi funkcjonalnościami? Do tego mamy jeszcze brancha który odzwierciedla stan aktualnej produkcji i chcemy zrobić w nim poprawkę ale tak żeby nie zgubiła się w wersji developerskiej. Gitflow odpowiada na te wszystkie problemy poprzez narzucanie sensownego modelu branchowania i dodanie kilku komend które znacznie ułatwiają połapanie się w tym całym chaosie.

Scenariusz

Nauczymy się tworzyć feature branche przy pomocy gitflowa oraz jak sprawnie się między niemi przełączać i dzielić z innymi developerami. Kolejny krok to release. Sprawdzimy jak gitflow może pomóc nam w tej sytuacji. Gdzie powinny trafić commity robione podczas release'u, Kiedy powinniśmy otagować repozytorium oraz jak cofnąć nieudany release. Na koniec poznamy zestaw komend "gitflow hotfix ...". Dowiemy się jak zarządzać poprawkami do wersji produkcyjnej i dlaczego używać do tego gitflowa zamiast samemu wykonywać merge'e i cherry-pick'i.


Git refspec (fetchowanie określonych branche'y)

Motywacja

Słów push, pull, master używasz codziennie. Ale czy czasami zdarzło Ci się używać ":" w komendach gita? Wiesz co to jest pull origin +master:master? Jak fetchować tylko interesujące Cię branche? Jak skasować zdalnego branche'a? Kata pokaże Ci to co jest refspec i jak się tego używa w najpopularniejszych komendach jak pull i push

Scenariusz

Rozpoczniemy od omówienia struktury refspec, spróbujemy znaleźć ją w konfigu naszego repo. Nauczymy się jak dużą siłę ma "+". Zrobimy kilka zdalnych branche'y w róznych refspecach i nauczymy się jak śledzić tylko te, które nas interesują.


Merging vs rebasing

Motywacja

Czym różni się merge od rebase? Dlaczego jeden z nich jest lepszy, jak to się ma do historii repozytorium i commitów?

Scenariusz

Dowiemy się jak wygląda repozytorium przed i po mergach, rebaseach. Reprezentację obiektów GITowych oraz wpływ na nasz kod i pojawianie się konfliktów.


USB workflow

Motywacja

Czasami zdarza się, że przygotowanie serwera ze zdalnym repozytorium może być niepotrzebnym overheadem, lub jest po prostu niemożliwe (np. ze względu na brak dostępu do sieci). Taka sytuacja może się wydarzyć np. na warsztatach podobnych do Git Kata. Dzięki temu, że każde repozytorium gita jest pełną kopią, to możemy wykorzystać dowolny nośnik jako nasz "serwer" z głównym repozytorium. W przypadku tego Kata naszym serwerem stanie się zwykły pendrive.

Scenariusz

Na początku zaczniemy od omówienia jak może wyglądać konfiguracja/zestaw środowisk do pracy z repozytorium na USB. Następnie szybko zestawimy takie środowisko dla przykładowych maszyn i założymy repozytorium. Kolejne kroki to będzą przykładem jak może wyglądać praca/wymiana dancyh poprzez repozytorium na USB.


Przyjmowanie zmian ze świata, lokalne ficzer branche, odratowanie stasha po dropie

Motywacja

Gdy pracujemy świat nie śpi. Inni programiści dokonują zmian i czasem okoliczności zmuszają nas do uwzględniania ich przed dokonaniem pusha do mastera. W Subversion update przy niefortunnym commicie kolegi mógł zapewnić nam godziny dodatkowej pracy. Mając Gita jesteśmy w dużo lepszej sytuacji. Celem katy jest odpowiedź na pytania: Co to jest stash? Co to są lokalne ficzer branche? Dlaczego warto ich używać? Jak naprawić blokera na produkcji mając rozgrzebany nowy ficzer?

Scenariusz

Zaczniemy od sposobów radzenia sobie z przyjmowaniem do siebie zmian commitowanych przez inne osoby w sytuacji, kiedy nasz kawałek nie jest jeszcze gotowy i nie chcemy/nie możemy go wysłać do zdalnego repozytorium. Następnie zobaczymy dlaczego zamiast na masterze warto pracować na lokalnych ficzer branchach i jak szybko przejść od zaplanowanej pracy do ""gaszenia pożaru na produkcji"". Jako bonus zobaczymy, co zrobić jak przypadkiem zamiast ""stash pop"" wpisze nam się ""stash drop"". Uwaga. Kata częściowo zazębia się z "Merging & Rebasing".


Undoing changes

Motywacja

"Oops, ten commit nie miał tak wyglądać", "Zapomniałem o jednym pliku", "Źle rozwiązałem ten konflikt". Jak zmienić message, jak odwrócić commit, jak zmienić historię? Ta kata nauczy Cię jak wyjśc obronną ręką z sytuacji, w których coś poszło nie tak

Scenariusz

Zaczniemy od najprostszej zmiany ostatniego commita. Potem będziemy je odwracać - jeden lub kilka. Nauczymy się też usuwać commit z historii przy użyciu reset i rebase -i. Zakończymy reflogiem, który pomoże nam w naprawdę trudnych chwilach :) Jeśli starczy czasu przejdziemy przez git clean i git checkout --


Git rerere

Motywacja

Git rerere, czyli "Reuse Recorder Resolution" pozwala zaoszczędzić dużo czasu spędzonego nad mozolnym rozwiązywaniem konfliktów w GIT. Kata nie tylko nauczy Cię jak włączyć i korzystać z tej opcji, ale pokaże Ci jak to wszystko działa i w jakich sytuacjach ta opcja może Ci zaoszczędzić mnóstwo czasu

Scenariusz

Rozpoczniemy z kilkoma skonfliktowanymi ze sobą branche'ami, które będziemy chcieli zmerge'ować. Sprawdzimy ile czasu spędzimy nad rozwiązaniem wszystkich konfliktów. Następnie skorzystamy z rerere i zobaczymy co się zmieni. Kata zakończy się pokazaniem jak mechanizm rerere działa pod spodem, jakie ma wady i zalety. Zakończymy odpowiedzią na pytanie: "Jak pracować w grupie, aby mieć jak najmniej konfliktów"


Bebechy gita: katalog .git i jak to działa

Motywacja

Początkujący gitowcy często narzekają, że polecenia nie mają sensu, a sam git jest zakręcony jak słoik. Tymczasem bebechy gita są banalnie proste i super skuteczne. To tylko API jest delikatnie mówiąc przekombinowane. Jeśli poznać zawartość katalogu .git i co się w nim dzieje, można dużo lepiej zrozumieć gita i jego API. W sytuacji awaryjnej, pomoże nam to odzyskać dane i lub zrobic to co chcemy, gdy w innej sytuacji musielibyśmy najpierw nauczyć się nowej komendy (potencjalnie niebezpiecznej).

Scenariusz

Przejdziemy przez zawartość katalogu .git i zobaczymy co gdzie leży, jak się uzupełnia, jak modyfikować gita bez używania poleceń (edytorem tekstu) i co z tego wszystkiego wynika (np. jak się przestać bać, robić prosty backup, albo zrozumieć git reset). Ponadto przedstawione zostaną obiekty w gicie dzięki poznaniu których zrozumiemy dlaczego jest jednym z najlepszych systemów kontroli wersji.


Git bisect

Motywacja


Uwaga: pełne uczestnictwo w tej kacie wymaga zainstalowanego mavena lub gradle

Czasami, nawet pomimo używania continous integration i testów automatycznych, pojawia się w projekcie tajemnicza regresja. Co gorsza, nikt z zespołu nie ma pomysłu, co ją mogło spowodować. Wtedy z pomocą przychodzi nam komenda git bisect.

Scenariusz

Na specjalnie przygotowanych gałęziach zobaczymy jak znaleźć commita, który "popsuł" coś w projekcie. Najpierw regresji będziemy szukać za pomocą testów ręcznych. Potem na gałęzi zawierającej tysiąc commitów znajdziemy problematyczną zmianę wpisując w konsoli tylko jedną komendę.


Git-svn

Motywacja

Pracujesz nad projektem, która nadal korzysta z SVN. A twój szef oraz twoi koledzy są niechętni do wprowadzania zmian. Natomiast, Ty jako innowator chcesz korzystać z bardziej zwinnych technik programowania. Git daje Ci taką możliwość! Wykorzystaj dostępną infrastrukturę w połączeniu z mocą Gita.

Scenariusz

Zaczniemy od przygotowania repozytorium Git na bazie już istniejącego repozytorium SVN. Przećwiczymy pracę na branchach, dodawnie oraz usuwanie tagów. Nauczymy się jak należy pullować i pushować do repozytoriów SVN oraz czego nie należy robić wykorzystując git-svn. Jako uzupełnienie wspominmy o obsługiwanych właściwościach repozytoriów SVN.


Fish shell & git prompt

Motywacja

Masz linuxa? Używasz basha? Ta kata jest dla Ciebie! Poznasz bash++ czyli konsolę fish i jej wsparcie dla gita. Po tej kacie nie będziesz już zastanawiał się na jakim branche'u pracujesz, czy jesteś w trakcie rebase'a a może rozwiązujesz jakiś konflikt w trakcie merge'a. Przestaniesz używać git status do sprawdzenia, czy wszystko co scommitowałeś zostało wypchnięte do upstreama.

Scenariusz

Kata będzie podzielona na dwie części: fish i git+fish. Zaczniemy od instalacji konsoli fish. Omówimy jej przewagę nad bashem. Druga część to włączenie funkcji git_prompt, tune'owanie jej zachowania i stworzenie swojego własnego prompta.


Praca z serwisami: github, bitbucket

Motywacja

Do pracy przy projektach komercyjnych zazwyczaj będziesz wykorzytywał(a) repozytorium, które będzie umieszczone w wewnętrznej sieci twojej firmy/klienta. Jeśli jednak chciał(a)byś pobawić się w wolnym czasie jakimś prywatnym lub otwartym projektem, np. nad stworzyć fajną grę, to serwer z repozytorium umożliwiającym synchronizację pomiędzy różnymi programistami (lub pomiędzy twoim różnymi maszynami) może znacznie ułatwić Ci zabawę. Dzięki serwisom github i bitbucket nie musisz samodzielnie stawiać własnego serwera Git.

Scenariusz

W tej kacie skupimy się nie tylko na omówieniu i przedstawieniu w jaki sposób zestawić sobie środowisko do pracy z serwisem github i bitbucket, ale też postaramy się zobaczyć jaki inne zalety (poza samym trzymaniem historii naszych zmian) oferują nam te serwisy. Ponadto zobaczymy w jaki sposób można jednocześnie korzystać z obu serwisów pracując nad jednym projektem.


Patches

Motywacja

Czy zastanawiałeś się jak wygląda praca nad projektami OpenSource, takimi jak linux-kernel, OpenWrt, czy Proxmox? Okazuje się, że pull request nie zawsze jest najlepszym i najwygodniejszym rozwiązaniem. Z pomocą przychodzą wbudowane narzędzia: format-patch, email-patch i am.

Scenariusz

Naczymy się jak korzystać z wyżej wymienionych narzędzi zamiast standardowych pull requestów.


Git rebase -i

Motywacja

Interaktywny rebase w Gicie pozwala na bardzo zwinne operowanie strukturą historii w poukładany i prosty sposób. Kata ma za zadanie pokazać jak posługiwać się instrukcją, jakie mamy możliwości i na co uważać.

Scenariusz

Zaczynamy od przełożenia jednego commita na inny branch. Następnie przekładamy zakres commitów. Później przekładamy brancha. Kolejny etap to zmiana kolejności commitów, usuniecie jednego z nich. Na koniec dowiemy się kiedy i jak robić zamieszanie w historii, a kiedy nie wolno.


reset vs. revert

Motywacja

Pomyłki się zdarzają się nawet najlepszym. Ci mniej doświadczeni popełniają je znacznie częściej. Jeżeli tylko zachowamy spokój w zdecydowanej większości przypadków możemy eleganko (i bez śladu) odwrócić niepożądane operacji wykonane na repo lokalnym. Jeżeli zdarzy się już push na serwer zdalny nie wszystkie chwyty są nadal dozwolone, ale wciąż możemy odwrócić nasze zmiany.

Scenariusz

Przyjrzymy się dwóm podejściom do naprawiania niechcianej sytuacji w repozytorium. Nauczymy się cofać niechciane commity, nieudane merge oraz usuwać ""śmieci"" wrzucone do repo zdalnego przez niedoświadcoznego kolegę. Dowiemy się czym różnią się od siebie, jakie mają wady i zalety oraz kiedy powinniśmy (a kiedy nie możemy) ich stosować. Uwaga. Kata w sporej części zazębia się z ""Undoing changes"".