Cíl
===
-Naučit se pracovat verzovacím systémem [Git][git], zejména nás bude
-zajímat jeho využití pro distribuovaný vývojový model, který je
-využíván mnoha open source projekty.
+Naučit se pracovat s verzovacím systémem [Git][git]. Konrétně nás bude
+zajímat:
+
+* 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 rozhodnování jak správně vyřešit určitý konflikt.
[git]:http://git-scm.com/
Git je velmi univerzální nástroj pro správu a synchronizaci dat
v souborech. Kromě verzování softwaru ho lidé používají
-k [mnoha dalším činnostem][gitsurvey09-usedfor]. Jedna z často
+k [mnoha dalším činnostem][gitsurvey-usedfor]. Jedna z často
zmiňovaných nevýhod Gitu je, že oproti jiným verzovacím systémům je
těžší se ho naučit a používat. Možným důvodem je to, že git nabízí
větší funkcionalitu než většina ostatních systémů, která se ale
je, že Git se neustále vyvíjí a mnoho úsilí je věnováno právě zlepšení
uživatelské přivětivosti.
-[gitsurvey09-usedfor]:http://git.wiki.kernel.org/index.php/GitSurvey2009#07._I_use_Git_for_.28check_all_that_apply.29:
+[gitsurvey-usedfor]:http://www.survs.com/app/12/wo/EO2kVRp9LtOtfmGQs0tl3g/0.0.0.7.7.3.0.1.1.5.6.1.1.9.1
Pro pochopení Gitu je důležité mít základní představu o tom, jak Git
-pracuje s větvemi, jak bylo popsáno v [[přednášce|prednasky/intro-to-git.pdf]]
+pracuje s větvemi, což bylo popsáno v [[přednášce|prednasky/intro-to-git.pdf]]
na slidech "*Working on branches*" a "*Working with remotes*".
V tomto cvičení budeme opět pracovat s projektem
* Příkaz `gitk` zobrazuje graficky historii a dovoluje její
interaktivní procházení. Přijímá stejné volby jako `git log`, takže
- v příkazech níže ho můžete použít i pro vizualizaci výstupu `git
+ v příkazech níže ho můžete použít i pro "vizualizaci" výstupu `git
log`.
* Příkaz `git gui` je grafický nástroj částečně nahrazující příkazy
Příkaz `git ls-files po m4` vypíše všechny soubory z adresářů *po*
a *m4*, které jsou spravované gitem a příkazem `git update-index
--assume-unchanged` pak gitu sdělíme, aby si do indexu poznamenal,
- že tyto soubory má ignorovat.
+ že má tyto soubory ignorovat.
> *Poznámka:* Možná víte o souborech *.gitignore* (viz `man
> gitignore`), které slouží k podobnému účelu. Ostatně midnight
Vidíme, že máme nakonfigurovaný repozitář s názvem *origin* a jeho
URL.
-1. Pokud chceme nějaký konkrétní vzdálený repozitář používat často,
+1. Pokud chceme nějaký vzdálený repozitář používat často,
vyplatí se ho pojmenovat krátkým jménem (v příkladu níže *osp*),
abychom nemuseli pořád psát dlouhé URL:
- git remote add osp git://repo.or.cz/midnight-commander/osp.git
+ git remote add osp ssh://git@rtime.felk.cvut.cz/osp/mc
+
+ V tomto repozitáři je uloženo zadání dnešní úlohy. Abyste se k němu
+ dostali, musí server znát váš veřenjný SSH klíč. Jak toho docílit
+ najdete na [[samostatné stránce|rtime-git-ssh-key]]. Přístup k
+ repozitářům na serveru rtime budete potřebovat i v písemce. **Proto
+ vám důrazně doporučujeme zprovoznit přístup už na tomto cvičení,
+ abyste při písemce neztráceli čas.**
2. Nyní můžeme stáhnout obsah právě přidaného repozitáře:
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
+
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 vzdálená větev má prefix `<remote>/`.
+ je v tom, že jméno vzdálené věteve má prefix `<remote>/`.
4. Nyní nás zajímá co je ve větvích, které jsme právě stáhli:
git log osp/only-directories ^master
git log master..osp/only-directories
Tyto dva příkazy jsou ekvivalentní a vypisují commity, které jsou
- ve větvi *osp/only-directories* a zároveň nejsou ve větvi *master*.
+ ve větvi *osp/only-directories* a zároveň nejsou (^) ve větvi *master*.
- Chcete-li vidět i změny v kódu použijte jeden z následujících příkazů
+ Chcete-li vidět i změny v kódu použijte jeden z následujících příkazů:
+
git log -p osp/only-directories ^master
gitk osp/only-directories ^master
git merge osp/only-directories
Výsledek bude vypadat pravděpodobně takto:
- Renaming doc/mc.1.in => doc/man/mc.1.in
Auto-merging doc/man/mc.1.in
- Auto-merging src/find.c
- CONFLICT (content): Merge conflict in src/find.c
- Automatic merge failed; fix conflicts and then commit the result.
- Vidíme, že git správně zjistil, že soubor `doc/mc.1.in` byl
- v novější verzi přejmenován a provedl sloučení až po přejmenování.
- Při slučování změn ve `src/find.c` už takové štěstí nemáme a
- výsledkem je konflikt.
+ Auto-merging src/filemanager/find.c
+ CONFLICT (content): Merge conflict in src/filemanager/find.c
+ Automatic merge failed; fix conflicts and then commit the result.
+
+ Vidíme, že se automaticky povedlo sloučit změny v souboru
+ `doc/mc.1.in`, ale při slučování změn ve `src/find.c` už takové
+ štěstí nemáme a výsledkem je konflikt.
Řešení konfliktů
abychom zjistili co je ještě potřeba vyřešit. V našem případě vypadá
výstup zhruba takhle:
- # On branch merge-assignment
+ # On branch homework
# Changes to be committed:
#
# modified: doc/man/mc.1.in
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
- # both modified: src/find.c
- #
+ # both modified: src/filemanager/find.c
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 oprait tak, aby dávala smysl a poté zmíněné
+ 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. `kdiff3` vedle
+ [kdiff3][kdiff3]), který vá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`.
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.
+ 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
+ řadek, které maji v levém sloupci `?` - tj. konfliktů.
* `gitk --merge` - zobrazí pouze commity, které modifikovaly
konfliktní soubory.
+
[kdiff3]:http://kdiff3.sourceforge.net/
+
Repozitář na repo.or.cz
---------------------------
dostupné pro ostatní je užitečné založit si vlastní repozitář, odkud
si budou moct ostatní vaše změny stáhnout.
-1. [Zaregistrujte][reg] se na [repo.or.cz][roc]. K repozitáři na
+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íčů.
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 kopí
- jiného repozitáře (*mirror*) a nebo zda-li bude možné do něj přímo
- ukládat nové commity (*push*).
+ 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*).
Pro účely tohoto cvičení si
- [založte fork Midnight commanderu][forkmc] v *Push módu*, který se
+ [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
nahrajete úkol z dnešního cvičení.
Zadání
======
-Proveďte sloučení větve `git://repo.or.cz/midnight-commander/osp.git
-only-directories` s aktuální vývojovou větví (`master`). Výsledek
+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