Naučit se pracovat 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é
+* 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ář][w/osp.git] 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 [[rtime-git-ssh-key|samostatné stránce]]. 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
+
+ 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 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
- # 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
- #
+ # 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/filemanager/find.c
Konflikt lze řešit následujícími způsoby:
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 kopií
- jiného repozitáře (*mirror*) a nebo zda-li bude možné do něj přímo
- ukládat nové commity (*push*).
+ 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][forkmc] [Midnight commanderu][w/osp.git] v *Push módu*, který se
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` z prvního cvičení). 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`.