* využití Gitu pro distribuovaný vývojový model, který je praktikován
mnoha open source projekty,
* efektivní prohledávání historie projektu, které je užitečné
- například při rozhodování, jak správně vyřešit určitý konflikt.
+ například při rozhodování, jak správně vyřešit určitý konflikt a
+* řešení konfliktů.
[git]:http://git-scm.com/
git fetch osp
V případě úspěchu bude výstup vypadat následovně:
- remote: Counting objects: 17, done.
- remote: Compressing objects: 100% (9/9), done.
- remote: Total 10 (delta 4), reused 7 (delta 1)
- Unpacking objects: 100% (10/10), done.
- From ssh://rtime.felk.cvut.cz/osp/mc
- * [new branch] master -> osp/master
- * [new branch] only-directories -> osp/only-directories
+ remote: Counting objects: 34, done.
+ remote: Compressing objects: 100% (17/17), done.
+ remote: Total 20 (delta 17), reused 6 (delta 3)
+ Unpacking objects: 100% (20/20), done.
+ From ssh://rtime.felk.cvut.cz/osp/mc
+ * [new branch] master -> osp/master
+ * [new branch] only-directories -> osp/only-directories
+ * [new branch] only-directories-old -> osp/only-directories-old
3. Příkaz nám vypíše, že v repozitáři byly dvě nové větve. Všechny
větve ze vzdálených repozitářů vypíšeme příkazem
git branch -r
Zjednodušeně řečeno, jediný rozdíl mezi lokální a vzdálenou větví
je v tom, že jméno vzdálené větve má prefix `<remote>/` (v našem
- případě `osp`).
+ případě `origin/` nebo `osp/`).
4. Nyní nás zajímá co je ve větvích, které jsme právě stáhli:
Pokud došlo v případě *True merge* ke změně stejného místa v kódu v
obou větvích, dojde k tzv. *konfliktu*, který musí být vyřešen ručně.
-1. Zkuste provést sloučení vaší větve *master* s *origin/master*
+1. Zkuste provést sloučení své větve *master* s *origin/master*
git merge origin/master
Výsledkem bude *Fast forward* a uvidíme jaké soubory byly změněny:
commit` (jak nám git napovídá v hláškách)
V průběhu řešení konfliktu je užitečné používat příkaz `git status`,
-Abychom zjistili co je ještě potřeba vyřešit. V našem případě vypadá
-Výstup zhruba takhle:
+Abychom zjistili, co je ještě potřeba vyřešit. V našem případě vypadá
+výstup zhruba takto:
# On branch homework
# Changes to be committed:
Konflikt lze řešit následujícími způsoby:
-* V textovém editoru najdeme sekvence `<<<<<<<<`, `=========` a
- `>>>>>>>>`, kterými jsou označené jednotlivé konfliktní oblasti.
- Tato místa musíme opravit tak, aby dávala smysl a poté zmíněné
- sekvence znaků smažeme.
-* `git mergetool` je nástroj, který spouští grafický nástroj (např.
- [kdiff3][kdiff3]), který vám se slučováním pomůže.
+* Soubor s konfliktem otevřeme v textovém editoru a najdeme sekvence
+ `<<<<<<<<`, `=========` a `>>>>>>>>`, kterými jsou označené
+ jednotlivé konfliktní oblasti. Tato místa musíme opravit tak, aby
+ kód dával smysl a poté zmíněné sekvence znaků smažeme.
+* Použijeme příkaz `git mergetool`, který spouští grafický nástroj
+ (např. [kdiff3][kdiff3]), který nám se slučováním pomůže.
- `kdiff3` vedle
- sebe zobrazuje 3 různé verze projektu: poslední společná verze
- (base), verzi z větve před slučováním (local) a verzi ze slučované
- větve (remote) tj. té uvedené jako parametr v příkazu `git merge`.
+ `kdiff3` vedle sebe zobrazuje 3 různé verze projektu: poslední
+ společná verze (base), verzi z větve před slučováním (local) a verzi
+ ze slučované větve (remote), tj. té uvedené jako parametr v příkazu
+ `git merge`.
Ve spodní části obrazovky je pak vidět výsledek slučování, který
můžeme měnit buď přímou editací a nebo výběrem jednotlivých verzí
pomocí tlačítek A, B a C. V tomto okně je potřeba zbavit se všech
- řádek, které mají v levém sloupci `?` - tj. konfliktů.
-* `gitk --merge` - zobrazí pouze commity, které modifikovaly
- konfliktní soubory.
+ řádek, které mají v levém sloupci `?` – tj. konfliktů.
-[kdiff3]:http://kdiff3.sourceforge.net/
+Při řešení konfliktů nám může pomoct i příkaz `gitk --merge`, který
+zobrazí pouze commity, které modifikovaly konfliktní soubory.
+Jednoduše tam můžeme zjistit, které změny konflikt způsobily.
-Repozitář na repo.or.cz
----------------------------
+Git obsahuje poměrně jednoduchý algoritmus (v porovnání s jinými
+verzovacími systémy) pro slučování různých verzí souborů. Některým
+studentům se to nelíbí a stěžují si. Přečtěte si
+[názor Linuse Torvaldse][mergealg], proč tomu tak je.
-K tomu, aby výsledky vaší práce na open source projektech byly snadno
-Dostupné pro ostatní je užitečné založit si vlastní repozitář, odkud
-si budou moct ostatní vaše změny stáhnout.
+[mergealg]:http://stackoverflow.com/questions/612580/how-does-git-solve-the-merging-problem/612747#612747
-1. [Zaregistrujte se][reg] na [repo.or.cz][roc]. K repozitáři na
- repo.or.cz se přistupuje protokolem SSH a autorizace se provádí na
- základě veřejných klíčů.
-
- 1. Pokud žádný klíč nemáte, vytvořte si ho příkazem
-
- ssh-keygen
+[kdiff3]:http://kdiff3.sourceforge.net/
- Příkaz se vás zeptá kam klíč uložit. Výchozí volba vám zpočátku
- bude stačit. Dále se zeptá na heslo (passphrase) k vašemu
- privátnímu klíči. Pokud žádné heslo nezadáte, bude se moct
- kdokoli, kdo se dostane k souboru s vaším klíčem (např.
- administrátor školních serverů), autorizovat jako vy.
-
- 2. Pokud jste se rozhodli chránit klíč heslem, je otravné zadávat
- heslo vždy, když klíč používáte. Naštěstí existuje program
- `ssh-agent`, který uchovává odheslované klíče v paměti a
- poskytuje je vždy, když je nějaký oprávněný program potřebuje.
- Vy tak zadáte heslo jen jednou a to když předáváte klíč
- ssh-agentovi příkazem
+Repozitář na GitHubu
+--------------------
- ssh-add
+K tomu, aby výsledky vaší práce na open source projektech byly snadno
+dostupné pro ostatní je užitečné založit si vlastní repozitář, odkud
+si budou moct ostatní vaše změny stáhnout.
-[reg]:http://repo.or.cz/reguser.cgi
-[roc]:http://repo.or.cz/
+1. Zaregistrujte se na [GitHubu](https://github.com/). V závislosti na
+ tom, jakým protokolem chcete k repozitářům na GitHubu přistupovat
+ si nastavte buď [password caching][passcache] (pro HTTP) nebo
+ [SSH klíče][sshkeys] (pro SSH).
-2. Vytvoření repozitáře na repo.or.cz.
+[passcache]:https://help.github.com/articles/set-up-git#password-caching
+[sshkeys]:https://help.github.com/articles/generating-ssh-keys
- Můžete založit buď [nový projekt][new] a nebo udělat tzv.
- [fork existujícího projektu][forkmc]. Pro oba typy projektů můžete
- zvolit zda bude repozitář pouze automaticky aktualizovanou kopií
- jiného repozitáře (*mirror mode*) a nebo zda-li bude možné do něj přímo
- ukládat nové commity (*push mode*).
+2. Vytvoření repozitáře na GitHubu. Můžete založit buď
+ [nový projekt][new] nebo udělat tzv. "fork" existujícího projektu.
- Pro účely tohoto cvičení si
- [založte fork][forkmc] [Midnight commanderu][w/osp.git] v *Push módu*, který se
- bude jmenovat podle vašeho loginu. Do tohoto repozitáře pak
+ Pro účely tohoto cvičení si [založte fork][forkmc]
+ [Midnight commanderu][osp-mc]. Do takto vytvořeného repozitáře pak
nahrajete úkol z dnešního cvičení.
-3. Do vašeho vzdáleného repozitáře můžete nahrát vaší větev některým z
- těchto způsobů
+3. Do svého repozitáře na GitHubu nahrajete větev z lokálního
+ repozitáře některým z těchto způsobů:
- git push ssh://<mujlogin>@repo.or.cz/srv/git/midnight-commander/osp/<mujfork>.git homework
- nebo
+ git remote add github https://github.com/<mujlogin>/mc.git
+ git push github HEAD:homework
+ nebo
- git remote add repo-or-cz ssh://<mujlogin>@repo.or.cz/srv/git/midnight-commander/osp/<mujfork>.git
- git push repo-or-cz homework
+ git push https://github.com/<mujlogin>/mc.git homework
+ nebo
-[new]:http://repo.or.cz/regproj.cgi
-[forkmc]:http://repo.or.cz/regproj.cgi?fork=midnight-commander/osp.git
+ git push ssh://git@github.com/<mujlogin>/mc.git homework
+
+[new]:https://github.com/new
+[osp-mc]:https://github.com/CTU-OSP/mc
+[forkmc]:https://github.com/CTU-OSP/mc/fork_select
Zadání
======
Proveďte sloučení větve `ssh://git@rtime.felk.cvut.cz/osp/mc
-only-directories` s aktuální vývojovou větví `origin/master`. Výsledek
-uložte do [vámi vytvořeného repozitáře (forku) na repo.or.cz][forkmc]
-do větve `homework`.
-
-[w/osp.git]:http://repo.or.cz/w/midnight-commander/osp.git
+only-directories` s aktuální vývojovou větví Midnight Commanderu
+(`origin/master`). Výsledek musí jít zkompilovat a musí obsahovat
+funkcionalitu přidanou do větve `only-directories`. Výsledek uložte do
+[vámi vytvořeného repozitáře (forku) na GitHubu][forkmc] do větve
+`homework`.