Git
Co tato dovednost pokrývá
Běžné operace s gitem, které se objevují při normálním vývoji: konfigurace repozitáře, staging a commitování, větvení a slučování, synchronizace s remote, prohlížení historie, stashování rozpracované práce a — to, co je nejdůležitější zvládnout správně — bezpečné vracení změn. Pro souběžnou práci na více větvích v oddělených adresářích viz Git Worktrees, pro větvící model Gitflow viz Git Flow.
Kdy ji použít
- Při hledání správného příkazu pro běžnou operaci s gitem
- Při rozhodování, jak něco vrátit (necommitnuté změny, špatný commit, již pushnutý commit) bez ztráty práce
- Při volbě mezi merge a rebase pro začlenění větve
- Při zotavení z chyby (detached HEAD, špatná větev, omylem provedený reset) — viz Řešení problémů
Nastavení a konfigurace
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
git config --global init.defaultBranch main
git init # nový repozitář v aktuálním adresáři
git clone <url> # kopie existujícího repozitáře
git clone <url> <dir> # do pojmenovaného adresáře
Staging a commitování
git status # co se změnilo / je ve stagingu
git add <file> # zařadit konkrétní soubor
git add -p # zařazovat výběrově, po částech (hunk)
git add . # zařadit vše pod aktuálním adresářem
git commit -m "message" # commitnout zařazené změny
git commit -am "message" # zařadit sledované soubory + commit (vynechá nové)
git commit --amend # přepsat poslední commit (jen pokud není pushnutý)
git add -p stojí za to zvyknout si — umožňuje zkontrolovat a rozdělit změny do
soustředěných commitů místo commitování nesouvisející práce dohromady.
Větvení a slučování
git branch # výpis lokálních větví
git switch <branch> # přepnout větev (moderní; nahrazuje checkout)
git switch -c <branch> # vytvořit a přepnout
git branch -d <branch> # smazat sloučenou větev
git branch -D <branch> # vynutit smazání nesloučené větve
git merge <branch> # sloučit <branch> do aktuální větve
git merge --no-ff <branch> # vždy vytvořit merge commit
Merge vs rebase:
git mergezachovává historii přesně a vytváří merge commit — bezpečná výchozí volba, zvlášť pro sdílené větve.git rebase <base>přehraje vaše commity nad<base>pro lineární historii — čistší, ale přepisuje hashe commitů.- Nikdy nerebasujte commity, které už ostatní stáhli. Přepsání sdílené historie vžene všechny ostatní do konfliktů.
git rebase main # přehrát aktuální větev nad main
git rebase -i HEAD~3 # interaktivně squash/reword/reorder posledních 3 commitů
Remote a synchronizace
git remote -v # výpis remotů
git remote add origin <url> # přidat remote
git fetch # stáhnout změny z remote, neslučovat
git pull # fetch + merge do aktuální větve
git pull --rebase # fetch + rebase (vyhne se merge commitu)
git push # pushnout aktuální větev
git push -u origin <branch> # push a nastavení upstreamu (poprvé)
git push --force-with-lease # bezpečný force-push — odmítne, pokud se remote nečekaně pohnul
Preferujte --force-with-lease před --force: stále odmítne přepsat práci,
kterou někdo pushnul po vašem posledním fetchi, takže nepřepíšete commity kolegy.
Prohlížení historie
git log --oneline --graph --all # kompaktní vizuální historie všech větví
git log -p <file> # historie s diffy pro jeden soubor
git show <commit> # zpráva a diff commitu
git diff # nezařazené změny
git diff --staged # zařazené změny
git blame <file> # kdo naposledy změnil každý řádek
Stashování
git stash # odložit necommitnuté změny, vyčistit strom
git stash -u # včetně nesledovaných souborů
git stash list # výpis stashů
git stash pop # znovu použít poslední stash a odstranit ho
git stash apply # znovu použít, ale ponechat ve stash listu
git stash drop # zahodit stash
Stashování je pro rychlé přepnutí kontextu. Pro cokoliv déletrvajícího je větev (nebo worktree) bezpečnější — stashe se snadno zapomenou a nemají název větve, který by připomněl, co obsahovaly.
Vracení změn
Správný příkaz závisí na tom, jak daleko změna došla. Od nejmírnějšího k nejdrastičtějšímu:
# Zahodit nezařazené změny souboru (nevratné — úpravy jsou pryč)
git restore <file>
# Vyřadit soubor ze stagingu, ale ponechat úpravy
git restore --staged <file>
# Vrátit poslední commit, ZACHOVAT změny ve stagingu
git reset --soft HEAD~1
# Vrátit poslední commit, ponechat změny v pracovním stromu (nezařazené)
git reset HEAD~1
# Vrátit poslední commit A zahodit jeho změny (destruktivní)
git reset --hard HEAD~1
# Vrátit commit novým commitem, který ho ruší (bezpečné pro sdílenou historii)
git revert <commit>
Pravidla:
- Ještě není pushnuto →
resetje v pořádku. - Už pushnuto / sdíleno → použijte
revert, nereset --hard+ force-push. git reset --hardagit restoretrvale zahodí necommitnutou práci — není undo. Pokud si nejste jistí, nejdřív commitněte nebo stashněte.
Řešení problémů
| Příznak | Řešení |
|---|---|
| Commit na špatnou větev | git switch <správná-větev> pak git cherry-pick <commit>; ze špatné větve ho odeberte přes git reset --hard HEAD~1 (pokud není pushnutý) |
| Detached HEAD (“not on a branch”) | git switch -c <nová-větev> pro zachování commitů, nebo git switch main pro jejich zahození |
| Potřeba vrátit “smazaný” commit | git reflog vypíše nedávné pozice HEAD; git reset --hard <sha> nebo git switch -c rescue <sha> |
Omylem reset --hard | Commity obvykle stále existují — najděte je přes git reflog a obnovte |
| Merge konflikt | Upravte označené soubory, git add je, pak git commit (nebo git merge --continue); git merge --abort pro ústup |
| Pushnuté tajemství (secret) | Okamžitě tajemství rotujte — přepsání historie neodstraní expozici |