Git Flow
Co tato dovednost pokrývá
Větvící model Gitflow — dvě dlouhověké větve (main, develop) plus tři druhy krátkověkých podpůrných větví (feature/*, release/*, hotfix/*) — a příkazy k obsluze každé z nich. Upřímně pokrývá i to, kdy je Gitflow špatná volba. Pro běžné příkazy gitu viz Git, pro souběžné větve v oddělených adresářích viz Git Worktrees.
Kdy ji použít
- Při rozhodování, odkud má změna větvit a kam se má slučovat zpět v Gitflow
- Při zahájení feature, přípravě release nebo nasazení urgentního hotfixu
- Při zavádění release-orientovaného větvícího modelu pro verzovaný produkt
- Při rozhodování, zda týmu vyhovuje Gitflow, nebo jednodušší model (trunk-based, GitHub Flow)
Větve
main— produkce. Každý commit je vydaná, otagovaná verze.develop— integrační větev. Dokončené features sem přistávají první.feature/*— jedna na jednotku práce; větví zdevelopa slučuje se zpět dodevelop.release/*— větví zdeveloppro stabilizaci verze; slučuje se domainidevelop.hotfix/*— větví zmainpro opravu produkce; slučuje se domainidevelop.
Gitflow lze řídit čistým git (níže, funguje všude) nebo rozšířením příkazové
řádky git flow, které stejné kroky obaluje.
Kdy Gitflow NEpoužívat
Stojí za to být upřímný — Gitflow je pro moderní webovou práci často špatná výchozí volba.
- Kontinuálně nasazované webové aplikace / SaaS: preferujte trunk-based development nebo GitHub Flow — krátkověké větve z
main, sloučit a nasadit. Dlouhověkédevelopa release větve Gitflow přidávají ceremonii, kterou pipeline nasazující při merge nepotřebuje. - Malé týmy / sólo projekty: režie se málokdy vyplatí.
- Pokud nasazujete
mainmnohokrát denně, rozdělenídevelop/releasejde proti vám.
Gitflow se vyplatí, když vydáváte oddělené, verzované release (instalovaný software, mobilní aplikace, knihovny, on-prem produkty) a možná musíte podporovat více verzí najednou.
Nastavení
# Čistý git: jednorázově vytvořit větev develop z main
git switch main
git switch -c develop
git push -u origin develop
# Nebo rozšířením git flow (interaktivní; přijměte výchozí hodnoty)
git flow init
Feature větve
Větví z develop, slučují se zpět do develop. Nikdy nevětvete feature z main.
# Start
git switch develop
git pull
git switch -c feature/short-description
# ... commity práce ...
# Finish — začlenění zpět do develop
git switch develop
git pull
git merge --no-ff feature/short-description
git push
git branch -d feature/short-description
# ekvivalent git flow
git flow feature start short-description
git flow feature finish short-description
--no-ff udrží commity feature seskupené pod merge commitem, takže tvar větve
zůstane v historii viditelný.
Release větve
Větví z develop, jakmile je rozsah release zmražen. Sem patří jen stabilizační
commity (bump verze, changelog, opravy chyb) — žádné nové features.
Slučte do main i develop a otagujte main.
# Start
git switch develop
git pull
git switch -c release/1.4.0
# ... bump verze, aktualizace changelogu, oprava blokujících chyb ...
# Finish
git switch main
git merge --no-ff release/1.4.0
git tag -a v1.4.0 -m "Release 1.4.0"
git switch develop
git merge --no-ff release/1.4.0 # aby se opravy z release větve vrátily do develop
git push origin main develop --tags
git branch -d release/1.4.0
# ekvivalent git flow
git flow release start 1.4.0
git flow release finish 1.4.0 # sloučí do main + develop a otaguje
Sloučení release zpět do develop je krok, na který se zapomíná — vynechte ho a
opravy chyb z release větve zmizí z probíhajícího vývoje.
Hotfix větve
Pro urgentní opravu produkce. Větev z main, sloučit do main i develop,
otagovat main novou patch verzí.
# Start z produkce
git switch main
git pull
git switch -c hotfix/1.4.1
# ... oprava chyby ...
# Finish
git switch main
git merge --no-ff hotfix/1.4.1
git tag -a v1.4.1 -m "Hotfix 1.4.1"
git switch develop
git merge --no-ff hotfix/1.4.1
git push origin main develop --tags
git branch -d hotfix/1.4.1
# ekvivalent git flow
git flow hotfix start 1.4.1
git flow hotfix finish 1.4.1
Pokud je při hotfixu otevřená release/* větev, slučte hotfix do release větve
místo do develop (release větev ho při finish přenese do develop) — jinak
slučujete stejnou opravu dvakrát.
Přehled větví
| Větev | Větví z | Slučuje se zpět do | Otagováno? |
|---|---|---|---|
feature/* | develop | develop | ne |
release/* | develop | main i develop | ano (na main) |
hotfix/* | main | main i develop | ano (na main) |
Bezpečnostní pravidla
mainje vždy vydatelný. Slučujte do něj jenrelease/*nebohotfix/*, vždy otagované.- Žádné features na
release/*nebohotfix/*— jen stabilizační/opravné commity. - Vždy slučte release a hotfix větve zpět do
develop, jinak se opravy z probíhající práce ztratí. - Používejte
--no-ffpro sloučení podpůrných větví, aby historie ukazovala, kde se každá větev začlenila. - Otagujte každé sloučení do
mainsémantickou verzí — tag je identitou vydaného artefaktu.
Řešení problémů
| Příznak | Příčina / řešení |
|---|---|
| Oprava z release větve chybí v nových features | Release větev nebyla sloučena zpět do develop — slučte ji nyní |
| Stejný hotfix aplikován dvakrát, merge konflikt | Hotfix sloučen do develop i otevřené release/* — slučte jen do release větve; ta ho přenese do develop při finish |
develop daleko před main, nikdy se nevydává | Kadence nasazení předbíhá model — zvažte trunk-based / GitHub Flow |
Příkaz git flow nenalezen | Nainstalujte rozšíření (git-flow / git-flow-avh), nebo použijte kroky s čistým gitem výše |
Feature omylem větvena z main | Rebasujte ji na develop: git rebase --onto develop main feature/x |