EN

Git

Praktický přehled gitu: staging a commitování, větvení a slučování, remote repozitáře, prohlížení historie, stashování a bezpečné vracení změn.

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 merge zachová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 → reset je v pořádku.
  • Už pushnuto / sdíleno → použijte revert, ne reset --hard + force-push.
  • git reset --hard a git restore trvale 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ětevgit 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ý” commitgit reflog vypíše nedávné pozice HEAD; git reset --hard <sha> nebo git switch -c rescue <sha>
Omylem reset --hardCommity obvykle stále existují — najděte je přes git reflog a obnovte
Merge konfliktUpravte 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