1. Základní nastavení. Aby vaše commity obsahovaly správné údaje o
vás, nastavte si jméno a email:
- git config --global user.name "Your Name Comes Here"
- git config --global user.email you@yourdomain.example.com
+ git config --global user.name "Your Name Comes Here"
+ git config --global user.email you@yourdomain.example.com
1. Předpokládáme, že máte zdrojové kódy midnight commanderu někde na
disku, takže se přesuňte do adresáře s nimi.
- cd ~/mc
+ cd ~/mc
Lokální větve
-------------
jí do nové větve *cviceni1*. Nejprve se ale podíváme v jakém stavu
máme zdrojové kódy:
- git status
+ git status
Dostaneme něco jako:
- # On branch master
- # Changed but not updated:
- # (use "git add <file>..." to update what will be committed)
- # (use "git checkout -- <file>..." to discard changes in working directory)
- #
- # modified: po/az.po
- # modified: po/be-tarask.po
- # modified: po/be.po
- # ...
- # modified: src/cmddef.h
- # modified: src/main.c
+ # On branch master
+ # Changed but not updated:
+ # (use "git add <file>..." to update what will be committed)
+ # (use "git checkout -- <file>..." to discard changes in working directory)
+ #
+ # modified: po/az.po
+ # modified: po/be-tarask.po
+ # modified: po/be.po
+ # ...
+ # modified: src/cmddef.h
+ # modified: src/main.c
Vidíme, že pracujeme na větvi *master* a vzhledem k verzi uložené v
repozitáři máme několik změněných souborů.
Naštěstí existuje možnost jak gitu říct, že nás změny v některých
souborech nezajímají:
- git update-index --assume-unchanged $(git ls-files po m4)
+ git update-index --assume-unchanged $(git ls-files po m4)
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
3. Vytvoříme větev *cviceni1* a přepneme se na ni:
- git checkout -b cviceni1
+ git checkout -b cviceni1
Nyní už by měl `git status` ukazovat že pracujeme s větví
*cviceni1* a vidíme pouze námi modifikované soubory.
4. Nyní provedeme *commit*:
- git commit -a -m 'Zmeny z prvniho cviceni'
+ git commit -a -m 'Zmeny z prvniho cviceni'
Parametrem `-a` říkáme, že "commitujeme" vše (all) a `-m` udává
komentář ke commitu (message). Kdybychom `-m` vynechali, git spustí
> *Poznámka:* Pokud vám nevyhovuje výchozí editor (většinou `vi`),
> nastavte si, že chcete používat jiný editor (např. `pico`):
>
- > git config --global core.editor pico
+ > git config --global core.editor pico
5. Nyní se přepneme zpět na větev *master*:
- git checkout master
+ git checkout master
V adresáři se vám teď objeví verze bez vašich úprav z 1. cvičení.
6. Seznam větví v našem repozitáři zjistíme příkazem
- git branch
+ git branch
Aktuální větev je označena hvězdičkou `*`.
Práce s více vzdálenými repozitáři
1. Které vzdálené repozitáře máme nakonfigurované zjistíme pomocí
- git remote -v
+ git remote -v
Vidíme, že máme nakonfigurovaný repozitář s názvem *origin* a jeho
URL.
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 ssh://git@rtime.felk.cvut.cz/osp/mc
+ 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
2. Nyní můžeme stáhnout obsah právě přidaného repozitáře:
- git fetch osp
+ 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: 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
+ 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ě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
+ 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*.
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 log -p osp/only-directories ^master
+ gitk osp/only-directories ^master
6. Podobně můžeme postupovat i s původním repozitářem. Jméno *origin*
je výchozí a proto ho nemusíme zadávat:
- git fetch
+ git fetch
Co přibylo ve větvi *master* od prvního cvičení zjistíme příkazem:
- git log master..origin/master
+ git log master..origin/master
Slučování větví (merge)
-----------------------
1. Zkuste provést sloučení vaší větve *master* s *origin/master*
- git merge origin/master
+ git merge origin/master
Výsledkem bude *Fast forward* a uvidíme jaké soubory byly změněny:
- git merge origin/master
- Updating 0ebd30c..a99dc51
- Fast forward
- configure.ac | 1 +
- contrib/Makefile.am | 9 +-
- ...
+ git merge origin/master
+ Updating 0ebd30c..a99dc51
+ Fast forward
+ configure.ac | 1 +
+ contrib/Makefile.am | 9 +-
+ ...
Toto je velmi častá operace a proto lze oprace `fetch` a `merge`
nahradit jedním příkazem
- git pull
+ git pull
2. Vždy, když člověk pracuje na nějaké netriviální změně, je užitečné,
založit si na to samostatnou větev. Dnešním úkolem bude sloučit
větev *osp/only-directories* s větví *master* a protože to není
triviální založte si na to novou větev:
- git checkout -b homework
+ git checkout -b homework
3. Pokud provedete sloučení
- git merge osp/only-directories
+ git merge osp/only-directories
Výsledek bude vypadat pravděpodobně takto:
- Auto-merging doc/man/mc.1.in
- 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.
+ Auto-merging doc/man/mc.1.in
+ 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é
* Vzdáme to a vrátíme se k verzi před slučováním
- git reset --hard
+ git reset --hard
* Konflikt vyřešíme a oznámíme to gitu příkazy `git add` a `git
commit` (jak nám git napovídá v hláškách)
1. Pokud žádný klíč nemáte, vytvořte si ho příkazem
- ssh-keygen
+ ssh-keygen
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
Vy tak zadáte heslo jen jednou a to když předáváte klíč
ssh-agentovi příkazem
- ssh-add
+ ssh-add
[reg]:http://repo.or.cz/reguser.cgi
[roc]:http://repo.or.cz/
3. Do vašeho vzdáleného repozitáře můžete nahrát vaší větev některým z
těchto způsobů
- git push ssh://<mujlogin>@repo.or.cz/srv/git/midnight-commander/osp/<mujfork>.git homework
+ git push ssh://<mujlogin>@repo.or.cz/srv/git/midnight-commander/osp/<mujfork>.git 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 remote add repo-or-cz ssh://<mujlogin>@repo.or.cz/srv/git/midnight-commander/osp/<mujfork>.git
+ git push repo-or-cz homework
[new]:http://repo.or.cz/regproj.cgi
[forkmc]:http://repo.or.cz/regproj.cgi?fork=midnight-commander/osp.git