You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Je o tom, jak pracovat v týmu, kde všichni členové používají Git.
3
3
4
+
Naučili mě to ve firmě: [Usertech](https://usertechnologies.com/).
5
+
4
6
## Proč?
5
7
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...
6
8
@@ -11,6 +13,7 @@ O tom je Git flow.
11
13
## Jak na to
12
14
Tohle je sranda obrázek organizačních struktur ve velkých IT firmách.
Zajímavý je pro nás obrázek Applu. Protože takle nějak vypadá Git flow.
15
18
16
19
### 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
69
72
Takže vytvoříme branch z branche `dev`. Nemáte ve svém repozitáři branch `dev`? Hmm...
70
73
```
71
74
// 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
73
76
```
74
77
75
78
#### Vytvoření commitu
@@ -89,7 +92,7 @@ Pushnutí znamená, že svojí lokální branch na svém stroji pošlete do vzd
89
92
Pokud tedy napíšete:
90
93
```
91
94
// radši píšu přesně to, co se děje
92
-
$ git push origin < vase branch >
95
+
git push origin < vase branch >
93
96
```
94
97
Tak `git` pošle commity, které jste udělali do vašeho forku a vytvoří tam novou branch. Do toho.
95
98
@@ -112,7 +115,13 @@ Existují klíčová slova - jako `address`, `closes` a další mě nenapadá. K
112
115
113
116
Pull request hotov od všech? Paráda, jdu to kontrolovat...
114
117
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
+
116
125
Sobě jsem udělal komentář, abych něco změnil a aktualizoval změny, mrkneme se na to.
117
126
118
127
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
139
148
##### Přidání remote
140
149
Přidání remote je jednoduché a nejdřív si je hezky zobrazíme:
Uh, to nejde, co? No to je proto, že jsem pojmenoval tenhle repozitář jako `origin` a nejde mít dva repozitáře pojmenované stejně.
150
159
@@ -155,8 +164,8 @@ Ale v Git Flow je aktuální vývojová větev - ta, kde je pravda - v našem sd
155
164
156
165
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.
157
166
```
158
-
$ git remote rename origin public
159
-
$ git remote -v
167
+
git remote rename origin public
168
+
git remote -v
160
169
```
161
170
Tak vidíme zde nyní dva remoty, kam můžeme pushovat -
162
171
- public (url našeho forku)
@@ -177,8 +186,8 @@ Nejjednodušší z nich j **pull**. Pull prostě stáhne commity z nějaké remo
177
186
Tedy:
178
187
```
179
188
// 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
182
191
```
183
192
184
193
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
192
201
193
202
Pojďme to zkusit.
194
203
```
195
-
$ git fetch origin
204
+
git fetch origin
196
205
```
197
206
Mělo by se něco vypsat - například to, že se vytvořila branch `origin/dev`.
198
207
@@ -204,25 +213,141 @@ A jsme na remote tracking branch, ze které můžeme dělat normální feature b
204
213
205
214
Pořád tedy funguje:
206
215
```
207
-
$ git checkout -b feature-branch origin/dev
216
+
git checkout -b feature-branch origin/dev
208
217
```
209
218
A teď je to to samé jako:
210
219
```
211
-
$ git checkout dev
212
-
$ git checkout -b feature-branch
220
+
git checkout dev
221
+
git checkout -b feature-branch
213
222
```
214
223
Je to stejné proto, že jsme přes **pull** aktualizovat lokální branch `dev`.
215
224
216
225
Pokud ale pořád chceme používat normálně lokální branch `dev` a nechceme používat destruktivní **pull** tak prostě rebasneme:
217
226
```
218
-
$ git checkout dev
219
-
$ git rebase origin/dev
227
+
git checkout dev
228
+
git rebase origin/dev
220
229
```
221
230
Můžete si to vyzkoušet tak, že si resetnete commity z branche `dev`.
222
231
A je to!
223
232
224
233
### Konflikty
225
234
A je to tady! Jsme to ale konfliktní lidé!
226
235
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!!
**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`!!
0 commit comments