Skip to content

Commit 4d6a778

Browse files
committed
finish git flow
1 parent 39bfd50 commit 4d6a778

File tree

2 files changed

+142
-15
lines changed

2 files changed

+142
-15
lines changed

git-flow.md

Lines changed: 140 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Git Flow
22
Je o tom, jak pracovat v týmu, kde všichni členové používají Git.
33

4+
Naučili mě to ve firmě: [Usertech](https://usertechnologies.com/).
5+
46
## Proč?
57
V první přednášce jsem mluvil o FTP. To nefunguje proto, že si všichni navzájem ničí změny a na jednou souboru může tedy pracovat jen jediný člověk v jednu chvíli. Plus je tady další tisíc problémů. Například ten, že se všechno v jednu chvíli smaže, pře spadne spojení, že se soubor poruší atd. atd...
68

@@ -11,6 +13,7 @@ O tom je Git flow.
1113
## Jak na to
1214
Tohle je sranda obrázek organizačních struktur ve velkých IT firmách.
1315
[![Forks](http://www.ericsson.com/uxblog/wp-content/uploads/2012/05/organizational_charts.jpg)](Forks)
16+
1417
Zajímavý je pro nás obrázek Applu. Protože takle nějak vypadá Git flow.
1518

1619
### Kdo je steve Jobs?
@@ -69,7 +72,7 @@ Je větev v repozitáři, do které se posílají **pull requesty**. Je to věte
6972
Takže vytvoříme branch z branche `dev`. Nemáte ve svém repozitáři branch `dev`? Hmm...
7073
```
7174
// ale to už přece umíte
72-
$ git checkout -b dev < Issue ID >-my-feature
75+
git checkout -b dev < Issue ID >-my-feature
7376
```
7477

7578
#### Vytvoření commitu
@@ -89,7 +92,7 @@ Pushnutí znamená, že svojí lokální branch na svém stroji pošlete do vzd
8992
Pokud tedy napíšete:
9093
```
9194
// radši píšu přesně to, co se děje
92-
$ git push origin < vase branch >
95+
git push origin < vase branch >
9396
```
9497
Tak `git` pošle commity, které jste udělali do vašeho forku a vytvoří tam novou branch. Do toho.
9598

@@ -112,7 +115,13 @@ Existují klíčová slova - jako `address`, `closes` a další mě nenapadá. K
112115

113116
Pull request hotov od všech? Paráda, jdu to kontrolovat...
114117

115-
#### Akceptování, komentování a mergnutí
118+
#### Code Review - Akceptování, komentování a mergnutí
119+
Some say, (já), že **Code Review** je důležitější než testy. Dokonce i kluci ze Salsity se mnou souhlasili, což byla čest.
120+
121+
Code Review je o tom, že se vám někdo podívá na váš pull request a že ho někdo zkontroluje, že ho někdo vyzkouší, že ho opřipomínkuje.
122+
123+
Osobně si **nedovedu** představit dělat vážně projekt, kterej by neměl žádné code review. Proto nejhorší věc, kterou můžete udělat je něco psát prostě sám bez nikoho cizího, kdo by se na to podíval!!!
124+
116125
Sobě jsem udělal komentář, abych něco změnil a aktualizoval změny, mrkneme se na to.
117126

118127
Ke změně pull requestu stačí jenom aktualizovat branch ve svém forku - to umíme, buďto tam pushneme nové commity nebo uděláme `ammend` udělám `ammend`, aby bylo vidět, co se stane.
@@ -139,12 +148,12 @@ No, musíme si přidat `webdev-js-evenings/git-workshop` jako **remote** repozit
139148
##### Přidání remote
140149
Přidání remote je jednoduché a nejdřív si je hezky zobrazíme:
141150
```
142-
$ git remote -v
151+
git remote -v
143152
```
144153
A vidíme jen origin, paráda. Teď zkusíme přidat.
145154

146155
```
147-
$ git remote add origin https://github.com/webdev-js-evenings/git-workshop.git
156+
git remote add origin https://github.com/webdev-js-evenings/git-workshop.git
148157
```
149158
Uh, to nejde, co? No to je proto, že jsem pojmenoval tenhle repozitář jako `origin` a nejde mít dva repozitáře pojmenované stejně.
150159

@@ -155,8 +164,8 @@ Ale v Git Flow je aktuální vývojová větev - ta, kde je pravda - v našem sd
155164

156165
Takže nejdřív si přejmenujeme remote našeho forku. Přejmenujeme si ho třeba na **public** protože většinou je náš fork veřejný, do kterého nám leze třeba projekťák nebo nám do něj leze senior vývojář, aby si stáhnul nedokončené změny a vyzkoušel nebo upravil to, co děláte.
157166
```
158-
$ git remote rename origin public
159-
$ git remote -v
167+
git remote rename origin public
168+
git remote -v
160169
```
161170
Tak vidíme zde nyní dva remoty, kam můžeme pushovat -
162171
- public (url našeho forku)
@@ -177,8 +186,8 @@ Nejjednodušší z nich j **pull**. Pull prostě stáhne commity z nějaké remo
177186
Tedy:
178187
```
179188
// přepneme se na naší dev branch
180-
$ git checkout dev
181-
$ git pull origin dev
189+
git checkout dev
190+
git pull origin dev
182191
```
183192

184193
See the magic happen...
@@ -192,7 +201,7 @@ Paráda, umíme si držet naší `dev` větev aktuální a z ní můžeme dál p
192201

193202
Pojďme to zkusit.
194203
```
195-
$ git fetch origin
204+
git fetch origin
196205
```
197206
Mělo by se něco vypsat - například to, že se vytvořila branch `origin/dev`.
198207

@@ -204,25 +213,141 @@ A jsme na remote tracking branch, ze které můžeme dělat normální feature b
204213

205214
Pořád tedy funguje:
206215
```
207-
$ git checkout -b feature-branch origin/dev
216+
git checkout -b feature-branch origin/dev
208217
```
209218
A teď je to to samé jako:
210219
```
211-
$ git checkout dev
212-
$ git checkout -b feature-branch
220+
git checkout dev
221+
git checkout -b feature-branch
213222
```
214223
Je to stejné proto, že jsme přes **pull** aktualizovat lokální branch `dev`.
215224

216225
Pokud ale pořád chceme používat normálně lokální branch `dev` a nechceme používat destruktivní **pull** tak prostě rebasneme:
217226
```
218-
$ git checkout dev
219-
$ git rebase origin/dev
227+
git checkout dev
228+
git rebase origin/dev
220229
```
221230
Můžete si to vyzkoušet tak, že si resetnete commity z branche `dev`.
222231
A je to!
223232

224233
### Konflikty
225234
A je to tady! Jsme to ale konfliktní lidé!
226235

236+
#### Kdy vzniká konflikt
237+
Představme si, že kolega má za úkol vymazat všechny soubory `.md` jenže vy o tom nevíte.
238+
239+
Takže vy i váš kolega si vytvoří z `dev` branch každý novou feature větev a jdete pracovat. Protože smazat soubory je jednoduché, tak kolega bude rychlejší a vytvoří pull request dříve než a také je rychle mergnut.
240+
241+
No a co teda vy? Máte vytvořenou feature branch z commitu, kde ještě soubory `.md` existují, ale přitom už jsou smazanány - vy to ale nevíte, takže vytvoříte pull request a v něm se píše, že nejde mergnout, protože tam je konflit, co teď?
242+
243+
Tak první krok je jasný, budete muset svojí větev `dev` aktualizovat a pak svojí feature branch rebasnou na aktuální `dev`, to vám ale nepůjde, protože zde bude konflit...
244+
245+
**Úkol:** Všichni prosím udělejte pull request s commmitem, ve kterém do souboru `git-flow/good-music.md` napíšete odkaz na nějakou hezkou písničky - pro inspiraci tam už nějaké kvalitní songy jsou.
246+
247+
Jakmile budete mít pull request, tak já commitem smažu a přesunu tento soubor jinam a uvidíme, co se bude dít.
248+
249+
#### Řešení konfliktů
250+
Abychom takový konflikt vyřešili, tak si musíme rebasnout na aktuální `dev`.
251+
252+
A při rebasování se objeví chyba. `git status` ukáže, co je špatně.
253+
```
254+
git s
255+
```
256+
Všimněte si, že jsme pořád ve fázi rebasu. Nyní můžeme dokonce rebase zrušit:
257+
```
258+
git rebase --abort
259+
```
260+
A všechno se vrátí do stavu, kdy jsme ještě neměli zobrazené žádné konflikty.
261+
262+
Ukazuje se, že soubor, který upravujeme byl smazán, OK. Paráda, tak to se má asi smazat. Proto použijeme:
263+
```
264+
git rm < soubor >
265+
```
266+
abychom i ve svém commitu soubor smazali.
267+
268+
A pak pokračujeme v rebasu:
269+
```
270+
git rebase --continue
271+
```
272+
273+
Měla by vyskočit chyba, protože my jsme vlastně naší změnu zcela smazali - smazali jsme soubor, který jsme upravovali, tudží se oproti větvi `dev` nic nezměnilo.
274+
275+
Git nám napovídá, že máme použít `--allow-empty` to ale nechceme. `--allow-empty` povolue prázdné commity a ty nemají význam. Proto prostě radši náš pull request stáhneme a zrušíme `rebase`.
276+
277+
#### Lepší konflikt
278+
Tak to jsme si ukázali jednoduchou věc.
279+
280+
Teď po Vás budu chtít, abyste smazali moje dvě písčničky a nahradili je dvěmi svými a udělali pull request.
281+
282+
Budu muset nějaké pull requesty mergnout, aby bylo vidět, jaký je v tom teď hokej...
283+
284+
Nyní si zkusme všichni aktualizovat `dev` a zkusit provést `rebase`. A zasekneme se, zkusíme `git status`.
285+
```
286+
git status
287+
```
288+
Vypíše se `both modified: < soubor >`. To znamená, že někdo upravil soubor na stejném místě jako vy a protože commity mají stejného předka, tak spolu navzájem bojují.
289+
290+
Otevřete si soubor a uvidíte, že se nám tam vypsali divné znaky, která ukazují, co je konfliktní.
291+
292+
Nejdřív si ale zapneme lepší mód pro řešení konfliktů:
293+
```
294+
git rebase --abort
295+
git config --global merge.conflictstyle diff3
296+
```
297+
`diff3` je lepší způsob zobrazení konfliktů. Ukazuje totiž ještě předka obou (nebo více) commitů, které spolu konfliktují.
298+
299+
Zkusme si znova rebasnout:
300+
```
301+
git rebase dev
302+
```
303+
A otevřeme si konfliktní soubor...
304+
Tak paráda, vidíme moje počáteční změny, pak vaše změny a pak změny kolegů - chceme nechat všechny změny, kromě mé původní verze!
305+
**POZOR:** prostřední část v tomhle zobrazení chceme prakticky vždy smazat, ukazuje totiž původní část kódu před tím, než je nějaké commity změnily!
306+
**POZOR:** při řešení konfliktu v rebasu měníte commity v historii!! Narozdíl od merge, který vytvoří commit, kde se řeší konflikty. Viz. výše.
307+
308+
#### Nééé, commitnul jsme konflikty!!
309+
To se stává často...
310+
311+
Rebase má oproti `mergi` trošku nevýhodu v tom, že commitnuté konflitky může nechat hluboko v historii. Říkáte si, že rebase přece nejde zvrátit? Vždyť přece nemůžeme všechny komity resetnout, ne?
312+
313+
Ne, to nemůžeme, ale můžeme se vrátit do stavu před tím, než jsme rebasovali. K tomu slouží **reflog**.
314+
315+
##### Reflog
316+
Reflog je log prakticky všech akcí, které v Gitu děláte. *Dají se přes ně najít branche, které jste opustili, nebo commity, které jste v historii vytvořili*.
317+
318+
Snadno se také přes `reflog` dá vrátit do stavu před tím než jste prováděli rebase. Zkuste si:
319+
```
320+
git reflog
321+
```
322+
Seznam všech akcí, pokud se chcete vrátit do stavu, kde jste byli dřív, stačí jenom:
323+
```
324+
git checkout < ID akce >
325+
```
326+
Nyní jste ve chvíli, kdy jste dělali tu kterou akci popsanou v reflogu. Nejste ale na žádné branchi, nejspíš jste na nějakém commitu, pokud chcete vytvořit z stavu branch, postupujete klasicky:
327+
```
328+
git checkout -b < nazev branche >
329+
```
330+
A pokud jste se checkoutnuly do stavu před rebasem, jste přesně tam, kde jste chtěli být!
331+
332+
333+
#### Hurá vyřešili jsme konflikty, můžeme pushnout
334+
Ale vono to zahlásí nějaký nesmysl...
335+
336+
Proč?
337+
338+
Protože jsme změnili historii - změnili jsme nějaký commit ručně a k tomu všemu jsme ještě rebasovali, takže jsem z větve `dev` narvali nějaké commity do historie naší feature branch.
339+
340+
Git je chytrej a tohle nedovolí, protože `push` povoluje jenom přírůstky a tohle je změna.
341+
342+
Nicméně v tomhle případě je jasný, že to, co máme lokálně je to správné a to, co je v remotu je zastaralé. Proto musíme použít sílu!!
343+
```
344+
git push --force < nas remote > < feature branch >
345+
//nebo
346+
git push -f < nas remote > < feature branch >
347+
```
348+
**POZOR:** Force pushování mění historii na remotu, můžete si tak něco smazat! Nebo tak něco smazat kolegům!
349+
350+
## Už to všichni umíme
351+
Proto dávám všem úkol. Každý najděte v mých dokumentech nějakou chybu - pravopisnou, překlep atd. Napište issue na github, udělejte vyvoněný pull request a já to mergnu a pak vydáme verzi `0.2`!!
227352

228353

git-flow/good-music.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Luštěla: https://www.youtube.com/watch?v=AHm5fndM8DQ
2+
Olivie: https://www.youtube.com/watch?v=DfaXxx1aOZE

0 commit comments

Comments
 (0)