-
Notifications
You must be signed in to change notification settings - Fork 61
Pár užitečných úprav které se mi hodili na Webdevu v Olomouci #86
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
881572d
df4910f
07dccd7
64daab2
8009366
082886c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,6 +24,26 @@ | |
## K čemu to je dobrý? | ||
Představte si, že na projektu pracuje tisíc lidí. Co když mají všichni najednou otevřený jeden soubor? Nebo jsou všichni na jednom síťovém uložišti...? | ||
|
||
## Základní nastavení Gitu | ||
Po nainstalovaní gitu je potřeba provést základní nastavení. Nejdůležitější je nastavit vaše uživatelské jméno a email. Tyto údaje se budou používat při každem | ||
vytvoření nového commitu. | ||
|
||
``` | ||
$ git config --global user.name "Daniel Suchy" | ||
$ git config --global user.email [email protected] | ||
``` | ||
|
||
Pokud bychom chtěli nastavit jiné jméno nebo email pro konkretní projekt, spustíme tyto příkazy ve složce daného projektu, bez přepínače `--global` | ||
|
||
Pokud chceme předejít adrenalinovým zážitkům s VIMem, hodí se nastavit výchozí editor na něco více user friendly: | ||
``` | ||
git config --global core.editor nano | ||
``` | ||
Nebo stejný příkaz na Windows pro editor Notepad++: | ||
``` | ||
git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -nosession" | ||
``` | ||
|
||
## Co je to Commit | ||
[](Commits) | ||
|
||
|
@@ -101,7 +121,8 @@ Pokud znova spustíme `git status` měla by se zobrazit změny `new file: notes. | |
|
||
Tato změna bude **unstaged**. Unstaged změny jsou takové, které nejsou připravené ke commitnutí. | ||
|
||
Krom toho bude soubor `notes.md` v terminologii Gitu brán jako **untracked**. Untracked soubor je takový soubor, který ještě nikdy nebyl přidán do Gitu. Tudíž Git sice vidí, že tam takový soubor je, ale nesleduje zatím jeho změny. | ||
Krom toho bude soubor `notes.md` v terminologii Gitu brán jako **untracked**. Untracked soubor je takový soubor, který ještě nikdy nebyl přidán do Gitu. | ||
Tudíž Git sice vidí, že tam takový soubor je, ale nesleduje zatím jeho změny. | ||
|
||
V tomhle případě je změnou vytvoření nového souboru. Git dokáže jednoduše rušit unstaged změny přes příkaz `git checkout`, ale to nefunguje na přidání složek nebo souborů, ty se normálně mažou pomocí `rm`. | ||
``` | ||
|
@@ -127,6 +148,8 @@ $ git config --global alias.s 'status' | |
$ git config --get-regexp alias | ||
``` | ||
|
||
### Zpět ke commitu | ||
|
||
Vytvoříme znovu soubor `notes.md` a pak přes `git s` uvidíme, že soubor byl znovu objeven Gitem! | ||
|
||
Unstaged změny nejdou commitnout: | ||
|
@@ -135,7 +158,8 @@ Unstaged změny nejdou commitnout: | |
$ git commit -m "tohle je přidání souboru" // nic se nestane | ||
``` | ||
|
||
Prve je potřeba si změny, se kterýma počítáme do commitu, - to jsou ty hezké učesané, odložit do **stage** fáze před commit, prostě si je tam hezky připravujeme. Staged změny jsou ty, které budou commitnuty, jakmile napíšeme příkaz `git commit`. Přidání do stage se dělá pomocí příkazu: | ||
Prve je potřeba si změny, se kterýma počítáme do commitu, - to jsou ty hezké učesané, odložit do **stage** fáze před commit, prostě si je tam hezky připravujeme. | ||
Staged změny jsou ty, které budou commitnuty, jakmile napíšeme příkaz `git commit`. Přidání do stage se dělá pomocí příkazu: | ||
|
||
``` | ||
// přidání do stage pro commit - příprava pro commit, uschování změn | ||
|
@@ -175,11 +199,12 @@ $ rm notes.md | |
No tak to už umíme, tak si pojďme ten soubor commitnout příkazem: | ||
|
||
``` | ||
// převedeme všechny soubory do stavu staged tzn. stavu kdy jsou připraveny ke commitnutí | ||
$ git add --all | ||
|
||
$ git commit | ||
``` | ||
**GOTCHA:** defaultní editor pro úpravu commit messages a vůbec všeho textového v Gitu je VIM. | ||
**GOTCHA:** Pokud jste si defaultní editor nezměnili pomocí git.config, je pro úpravu commit messages a vůbec všeho textového v Gitu VIM. | ||
A nikdo neví, jak do něj něco napsat nebo hůř, jak se z něj dostat, proto: | ||
|
||
Přepneme do zapisovacího módu: | ||
|
@@ -207,7 +232,7 @@ Pokud chceme předejít adrenalinovým zážitkům s VIMem, hodí se nastavit v | |
git config --global core.editor nano | ||
``` | ||
|
||
Jasně, nikoho nebaví se furt přepínat do VIMu. Proto existuje zkratka, kterou používám: | ||
Jasně, nikoho nebaví se furt přepínat do VIMu. Proto existuje zkratka, díky které nemusí lézt do žádného editoru: | ||
``` | ||
$ git commit -m "commit messsage" | ||
``` | ||
|
@@ -245,7 +270,7 @@ $ git log | |
// hezčí zobrazí seznamu | ||
$ git log --pretty=oneline -n 50 --graph --abbrev-commit | ||
// uděláme na něj alias | ||
$ git config --globa alias.l 'log --pretty=oneline --graph --abbrev-commit --branches --decorate -n 100' | ||
$ git config --global alias.l 'log --pretty=oneline --graph --abbrev-commit --branches --decorate -n 100' | ||
//vyzkoušíme | ||
$ git l | ||
|
||
|
@@ -260,7 +285,7 @@ Nejjednoduší "smazání" je přes příkaz **reset**: | |
// smazání posledního commitu (nejaktuálnějšího) | ||
$ git reset --hard HEAD~1 // odeber jeden nejnovější commit (na dané větvi) | ||
// případně | ||
// $ git rest --hard HEAD~2 // odeber dva nejnovější commity (na dané větvi) | ||
// $ git reset --hard HEAD~2 // odeber dva nejnovější commity (na dané větvi) | ||
``` | ||
**HEAD**? Řikáte si, co je to HEAD? Head je označení pro poslední commit větve nebo prostě commit, na kterém jste nastaveni. Proto mám poznamenáno: | ||
|
||
|
@@ -270,7 +295,7 @@ Nyní se podíváme na stav commitů, jak jdou za sebou `git l`. Vidíme, že n | |
|
||
**GOTCHA:** Smazat něco v Gitu je těžká práce, fakt hodně těžká. Smazat commit je z toho asi nejtěžší. Git po nějaké době maže sám ty commity, které nejsou u žádné branche (vysvětlíme). Chová se jako garbage collector a prostě maže to, k čemu není přístup. | ||
|
||
Takže Vojto, ten commit je smazaný? Ne, není. Jenom jsme ho odebrali z větve, snadno ho dáme zpátky. Je spousta cest, jak to udělat. | ||
Takže je ten commit opravdu smazaný? Ne, není. Jenom jsme ho odebrali z větve, snadno ho dáme zpátky. Je spousta cest, jak to udělat. | ||
|
||
#### Cherry-pick | ||
V našem případě si můžeme krásně zkusit příkaz **cherry-pick** (cherry-pick prostě vezme odněkud commit a přidá vám ho pod ruku (na vrchol branch a posune tak ukazatel HEAD), jak kdybyste ho právě udělali ručně): | ||
|
@@ -288,12 +313,16 @@ Takže umíme: | |
- přidat změnu do stage pro commit | ||
- smazat změnu ze stage pro commmit | ||
- vytvořit commit | ||
- jít do insert modu ve VIMu | ||
- odejít z VIMu | ||
- smazat poslední commity z branche | ||
- cherry-picknout commit zpátky | ||
|
||
Procvičit! Celé znovu!! | ||
``` | ||
$ cd .. | ||
$ rm -rf git-workshop | ||
// znova! | ||
``` | ||
|
||
**Úkoly**: Vše kontrolovat přes `git s` nebo `git l`!!! | ||
- vytvořit soubor `cvicime.md` | ||
- přidat soubor do stage pro commit | ||
|
@@ -310,11 +339,6 @@ Procvičit! Celé znovu!! | |
- smazat oba dva commity najednou | ||
- dostat přes Git je zpátky | ||
|
||
``` | ||
$ cd .. | ||
$ rm -rf git-workshop | ||
// znova! | ||
``` | ||
|
||
### Pokročilé operace | ||
|
||
|
@@ -332,7 +356,9 @@ Teď si každej řekne "Do piči, ten soubor `ten-se-ma-jmenovat-jinak.js` se m | |
|
||
Jak to smáznout z commitu? Mno. | ||
|
||
Jak jsem pravil, commit je neměnitelný - (immutable), tudíž commit jako takový nejde změnit, jde pouze nahradit jiným - snad nekecám. To je nám ale celkem šumák, protože výsledek je stejný. Kolikrát to ani člověk nepozná, neboť se u commitu třeba jenom změnit `commit id`. | ||
Jak jsem pravil, commit je neměnitelný - (immutable), tudíž commit jako takový nejde změnit, jde pouze nahradit jiným - snad nekecám. | ||
To je nám ale celkem šumák, protože výsledek je stejný. | ||
Kolikrát to ani člověk nepozná, neboť se u commitu třeba jenom změnit `commit id`. | ||
|
||
Takže **amend**: | ||
``` | ||
|
@@ -514,6 +540,20 @@ Jde o to, že když jsme vytvářeli branch `english` tak ona se vytvoří z bod | |
|
||
Proto je třeba nějak říct větvi `english`, aby se aktualizovala a my mohli překládat dál, jak to uděláme? | ||
|
||
### Merge | ||
Merge vezme branch, kterou mergujete do aktulní branche. Pak ji "schová" do `merge commitu` a pokud se vyskytnout konflikty, tak vám poručí je vyřešit a pak změny commitnout a tím se vytvoří merge commmit. | ||
|
||
#### Merge Commit | ||
Je zvlášní druh commitu, který drží ukazele na commity z branche, kterou mergujete. Takže je to commit, který v sobě schovává víc commitů. Výsledek merge je stejný jako výsledek rebasu - máte spojené dvě větve v jednu - s tim rozdílem, že merge vytvoří explicitní merge commit, kde jsou vyřešené konflikty, zatímco pomocí rebasu jen měníte stávající commity tak, aby nekonfliktovali. | ||
|
||
`Merge commit` se dá snadno smazat normálně pomocí `git reset --hard`. | ||
|
||
Takže namergujeme vetěv master do naší větve `english` pomocí příkazu: | ||
|
||
``` | ||
$ git merge master | ||
``` | ||
|
||
### Rebase | ||
Rebase je asi nejmocnější nástroj v Gitu, co existuje. Jdou s ním dělat neskutečný věci, ale prozatím stačí, když ho použijeme na aktualizaci větve `english` tak, aby její první commit měl za předka poslední, aktuální commit na větvi `master`. Prostě jí `pře-bázujeme`. | ||
|
||
|
@@ -548,4 +588,61 @@ Je zvlášní druh commitu, který drží ukazele na commity z branche, kterou m | |
|
||
V Master a Dev branchích jsou vidět merge commity, aby bylo jasné, jaké branch se kdy udělala a kdo jí udělal. | ||
|
||
## Ad.1 Branching - příklad přímo ze života programátora | ||
|
||
Je super že už umíme používat branche, mergovat a rebasovat, ale jak to použijeme při programování? | ||
|
||
Typický příklad že života je např. práce na webových stránkách. Pracujete na nějaké nové funkci na úvodní straně, v tom vám | ||
přijde mail že je potřeba rychle něco hotfixnout nebo upravit taktéž na domovské straně, nebo kdekoliv jinde. | ||
|
||
Jak to teda uděláte když nemáte GIT? Máte několik možností, můžete soubor upravit přímo na FTP serveru na produkci, nebo jsi z FTP můžete stáhnout do další | ||
složky původní verzi projektu, tam ji upravíte, otestujete a nahrajete zase zpátky. Pak také nesmíte zapomenout fix překopírovat do verze projektu kde máte rozpracovanou | ||
novou funkčnost. No prostě prostě prasárna vedle prasárny. | ||
|
||
Ale pokud máte GIT, použijete elegatní způsob pomocí branchí. | ||
|
||
#### Vytvoření vývojové větve | ||
``` | ||
// vytvoření větve feature a přepnutí do ní rovnou | ||
$ git checkout -b feature | ||
``` | ||
|
||
Nyní začneme pracovat na nové fičuře, doděláme jen část a najednou nám přichází email nebo telefonát že je nutně potřeba něco opravit. Tak jednoduše commitneme to co máme: | ||
|
||
``` | ||
$ git add --all | ||
$ git cm "new menu" | ||
``` | ||
|
||
Zatím ještě nechceme naše změny propisovat na web, protože ještě nejsou dokončeny a otestovány. Tak jak na to? | ||
|
||
Přepneme do masteru, pomocí `git checkout`. Poté provede požadovanou opravu a commitneme. | ||
|
||
``` | ||
$ git checkout master | ||
$ git add --all | ||
$ git cm "footer email change" | ||
``` | ||
|
||
Nyní můžeme beze strachu nahrát náš master na FTP a pak se pomocí `git checkout` přepnout zpátky na naši feature větev a pokračovat v práci. | ||
|
||
Jakmile dokončíme práci, můžeme pomocí `git commit --amend` připojit práci k předchozímu commitu s nedokončenou prací abychom nevytvářeli polovičaté commity. | ||
|
||
``` | ||
$ git checkout feature | ||
$ git add --all | ||
$ git commit --amend | ||
``` | ||
|
||
Co když ale budeme potřebovat fix, nebo úpravu co jsme udělali na masteru otestovat i s naší novou feature? Použijeme `git rebase`: | ||
|
||
``` | ||
$ git rebase master | ||
``` | ||
|
||
A máme hotovo, máme vytvořenou novou feature i s posledním fixem z masteru. Pokud by něco nefungovalo jednoduše to opravíme a commitneme. Jakmile máme vše otestováno, můžeme naši feature branch mergnout do masteru: | ||
``` | ||
$ git checkout master | ||
$ git merge feature | ||
``` | ||
|
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="utf-8"> | ||
<title>Webdev Olomouc - přednáška GIT</title> | ||
<link rel="stylesheet" href="style.css"> | ||
</head> | ||
<body> | ||
<header> | ||
<h1>Webdev Olomouc - přednáška GIT</h1> | ||
</header> | ||
<menu> | ||
<ul> | ||
<li><a href="https://www.facebook.com/groups/1874049622825379/">FB skupina</a></li> | ||
<li><a href="https://www.facebook.com/events/1904779056420262/">FB událost</a></li> | ||
<li><a href="http://danielsuchy.cz">Daniel Suchý</a> | ||
</ul> | ||
</menu> | ||
<content> | ||
<p> | ||
<h1>Ahoj světe</h1> | ||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. | ||
</p> | ||
</content> | ||
<footer style="text-align: center"> | ||
@danielsuchy | ||
</footer> | ||
</body> | ||
</html> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
:-D dobře no